段错误 (核心已转储) + free(): double free detected in tcache 2 已放弃 (核心已转储)
status$ ./server段错误 (核心已转储)# another terminal$ ./clientFile transfer success!free(): double free detected in tcache 2已放弃 (核心已转储)文件正常接受sulotion万事先搜索free(): double free detected in tcache 2 如何解决 从此为bug秃
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
- free(): double free detected in tcache 2 如何解决 从此为bug秃头 2021-04-19
- C++: free(): double free detected问题分析和处理 简单IoT 2021-01-22:同一段堆内存被free了两次,使用valgrind工具检查也发现了frees比allocs多了一次
- free(): double free detected in tcache 2. 2020
ou failed to write proper copy constructor and assignment operators:
DynamicArray(DynamicArray const& rhs); // copy constructor
DynamicArray& operator=(DynamicArray const& rhs); // copy assignment
更多推荐
所有评论(0)