status

$ ./server
段错误 (核心已转储)

# another terminal
$ ./client 
File transfer success!
free(): double free detected in tcache 2
已放弃 (核心已转储)

文件正常接受

sulotion

万事先搜索

free(): double free detected in tcache 2 如何解决 从此为bug秃头 2021-04-19
free():在tcache 2中检测到双空闲,在执行程序的过程中对同一块内存单元进行了两次free()操作
设置两个指针变量,n与pn,可以有效的避免双重空闲的问题。

C++: free(): double free detected问题分析和处理 简单IoT 2021-01-22:同一段堆内存被free了两次,使用valgrind工具检查也发现了frees比allocs多了一次
解决方法一:添加copy constructor和copy-assignment operator
解决方法二(推荐):使用智能指针

查了一下有那么集中情况:free()整了两次、构造复制函数&&赋值函数写错了。

然而这两种情况好像都对应不上。。。然后想了一下,释放内存两次??似乎循环了有个close。,但是 open 是在循环外面的,于是乎把 open 搬到循环里面或者把 close 搬到外面就行了。 错误部分源代码如下:

server.cpp


int main() {
  // 先检查文件是否存在
  FILE *fp = fopen("./client.cpp", "rb"); // 以二进制方式打开文件
  if (fp == NULL) {
    perror("Cannot open file");
    exit(EXIT_FAILURE);
  }

  while (true) {
    

    int nCount;
    while ((nCount = fread(buffer, 1, BUF_SIZE, fp)) > 0) {
      write(clnt_sock, buffer, nCount);
    }
    fclose(fp); // 关闭文件
   
    close(clnt_sock);
  }

  return 0;
}

client.cpp



int main() {
  FILE *fp = fopen("msgFromServer.txt", "wb"); // 以二进制方式打开(创建)文件
  if (fp == NULL) {
    perror("Cannot open file");
    exit(EXIT_FAILURE);
  }


  char bufSend[BUF_SIZE] = {0};
  char bufRecv[BUF_SIZE] = {0};
  while (true) {
    
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
      perror("Error: Connection creation failed");
      exit(EXIT_FAILURE);
    }

    //循环接收数据,直到文件传输完毕
    int nCount;
    while ((nCount = recv(sock, bufRecv, BUF_SIZE, 0)) > 0) {
      fwrite(bufRecv, nCount, 1, fp);
    }
    fclose(fp); // 文件接收完毕后直接关闭套接字,无需调用shutdown()

    printf("File transfer success!\n");

    close(sock); // 关闭套接字
  }

  return 0;
}

refer

ou failed to write proper copy constructor and assignment operators:

DynamicArray(DynamicArray const& rhs); // copy constructor
DynamicArray& operator=(DynamicArray const& rhs); // copy assignment
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐