c - 如何判断内存地址是否已被释放?
问题描述
这是我必须提取正则表达式匹配然后释放 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
我相信我第二次打印是打印一个已经释放的指针,但它返回相同的东西,因为它还没有被覆盖。有没有办法确认这一点?也就是说,我如何判断一个内存区域是否已被释放?
解决方案
程序内无法验证是否已释放特定的内存。
一旦内存被释放,任何指向该内存的指针的值都会变为不确定的。尝试取消引用指向已释放内存的指针会触发未定义的行为。
如果你想验证你是否释放了你应该释放的内存,你需要使用一个外部工具,比如 valgrind。它会告诉您是否有内存泄漏,或者您是否尝试访问不应访问的内存。
推荐阅读
- node.js - 我们是否应该将 Helmet 中间件与在 Firebase Cloud Function 上运行的 Express 应用一起使用?
- ios - 如何动画从表格视图(rxswift)中删除单元格?
- c - 从函数返回后,如何实现堆栈帧不被破坏?
- c# - 在 asp.net Core MVC 中更改 Facebook 身份验证按钮的布局
- typescript - TypeScript 中的“keyof typeof”是什么意思?
- asp.net-identity - 为多产品多租户应用程序 Asp.netCore 2.2 实现通用身份验证
- android - 使用 PagedListAdapter / PagedList 添加列表部分标题
- javascript - Javascript:具有相同值的对象数组的每个元素
- python - 加载的 LGBM 模型如何在不同的机器上产生不同的预测?
- javascript - 在where子句中对连接进行sequalize join以关联两个表