首页 > 解决方案 > 如何判断内存地址是否已被释放?

问题描述

这是我必须提取正则表达式匹配然后释放 malloc 匹配的基本代码块:

// malloc new substring and update bufferptr (here instead of passing the 
// buffer we pass a pointer with an address to be updated
PCRE2_UCHAR *bufferptr;
printf("Stack address: %p | Pointer value: %p\n", &bufferptr, bufferptr);
pcre2_substring_get_bynumber(match_data, 1, &bufferptr, &buffer_size);
printf("Extracted substring: '%s' | Code size: %zu | Stack address: %p | Pointer value: %p\n", bufferptr, buffer_size, &bufferptr, bufferptr);
pcre2_substring_free(bufferptr);
printf("Extracted substring: '%s' | Code size: %zu | Stack address: %p | Pointer value: %p\n", bufferptr, buffer_size, &bufferptr, bufferptr);

它当前打印出如下内容:

Stack address: 0x7ffeedbce5e8 | Pointer value: 0x0
Extracted substring: 'lo' | Code size: 2 | Stack address: 0x7ffeedbce5e8 | Pointer value: 0x7f88a8402c98
// after being free'd
Extracted substring: 'lo' | Code size: 2 | Stack address: 0x7ffeedbce5e8 | Pointer value: 0x7f88a8402c98

我相信我第二次打印是打印一个已经释放的指针,但它返回相同的东西,因为它还没有被覆盖。有没有办法确认这一点?也就是说,我如何判断一个内存区域是否已被释放?

标签: c

解决方案


程序内无法验证是否已释放特定的内存。

一旦内存被释放,任何指向该内存的指针的值都会变为不确定的。尝试取消引用指向已释放内存的指针会触发未定义的行为

如果你想验证你是否释放了你应该释放的内存,你需要使用一个外部工具,比如 valgrind。它会告诉您是否有内存泄漏,或者您是否尝试访问不应访问的内存。


推荐阅读