C语言free函数报错求助:检测到double free in tcache2
问题分析与解决
你遇到的free():double free detected in tcache2错误,根源是尝试释放字符串常量,同时代码还存在内存泄漏问题。
核心问题点
- 内存泄漏与非法指针赋值:你先通过
malloc给chaine分配了堆内存,但紧接着执行chaine = "ouii";,直接将chaine的指向改为只读数据段里的字符串常量,原来malloc的堆地址被丢失,造成内存泄漏。 - 非法释放内存:
D->chaine = chaine;让结构体成员指向了字符串常量,在supprimer函数里调用free(D->chaine)属于错误操作——字符串常量不是通过malloc/calloc/realloc分配的堆内存,不能用free释放。这种非法操作会破坏堆的内部结构,进而触发double free的检测报错。
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> // 引入strcpy所需头文件 typedef struct myStruct { char* chaine; struct myStruct* next; } mystruct; void supprimer(mystruct* D) { free(D->chaine); free(D); } int main() { mystruct* D = malloc(sizeof(mystruct)); if (D == NULL) { // 增加内存分配失败的判断 perror("malloc failed for struct"); return 1; } D->next = NULL; char* chaine = malloc(sizeof(char)*10); if (chaine == NULL) { // 检查字符串内存分配是否成功 perror("malloc failed for string"); free(D); // 避免结构体内存泄漏 return 1; } strcpy(chaine, "ouii"); // 将字符串常量复制到堆内存中 D->chaine = chaine; supprimer(D); printf("Hello World"); return 0; }
关键修复说明
- 用
strcpy将字符串常量"ouii"复制到malloc分配的堆内存中,确保D->chaine指向合法的堆内存,后续可安全调用free释放。 - 增加
malloc失败的判断逻辑,避免内存分配失败后继续操作引发的未定义行为。 - 统一使用typedef定义的
mystruct类型名,代码风格更规范。
内容的提问来源于stack exchange,提问作者lilo
相关产品推荐
相关产品推荐

