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
相关产品推荐
相关产品推荐

