You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言free函数报错求助:检测到double free in tcache2

问题分析与解决

你遇到的free():double free detected in tcache2错误,根源是尝试释放字符串常量,同时代码还存在内存泄漏问题。

核心问题点

  1. 内存泄漏与非法指针赋值:你先通过malloc给chaine分配了堆内存,但紧接着执行chaine = "ouii";,直接将chaine的指向改为只读数据段里的字符串常量,原来malloc的堆地址被丢失,造成内存泄漏。
  2. 非法释放内存: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:00:54