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

C语言中通过双指针释放内存后断言失败的解决方法

正确实现动态字符串释放函数的方法

问题核心:free()仅释放指针指向的内存,不会自动将原指针置为NULL。你的现有函数只完成了内存释放,没有修改传入的指针变量本身的值,所以调用后str1仍指向已释放的内存地址(野指针),导致断言失败。

正确的dstring_delete实现步骤

  • 首先断言传入的指针地址(DString*类型参数)非空,避免传入空地址导致后续操作崩溃
  • 接着断言要释放的字符串指针非空,防止重复释放空指针
  • 调用free()释放内存后,必须将原指针置为NULL,这样调用者的变量会同步变为NULL

完整代码示例

#include <stdlib.h>
#include <assert.h>

typedef char* DString;

void dstring_delete(DString* stringToDelete) {
    // 断言传入的指针地址非空
    assert(stringToDelete != NULL);
    // 断言要释放的字符串指针非空(可选,但能避免无意义的free(NULL))
    assert(*stringToDelete != NULL);

    free(*stringToDelete);
    // 关键:将原指针置为NULL,同步修改调用者的变量
    *stringToDelete = NULL;
}

// 调用示例
int main() {
    DString str1 = malloc(100);
    // ... 使用str1 ...
    dstring_delete(&str1);
    // 此时断言会成功
    assert(str1 == NULL);
    return 0;
}

补充说明

  • 置为NULL的目的:避免后续误操作野指针(比如重复释放、访问已释放内存),同时让调用者能通过指针是否为NULL判断内存状态
  • 若不执行置NULL操作,str1会保留原内存地址,内存虽已释放但指针值未变,这就是断言失败的直接原因

内容的提问来源于stack exchange,提问作者Marcus Hammarström

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:35:20