【发布时间】:2010-12-25 04:08:33
【问题描述】:
似乎有两个论点为什么要在释放它们之后设置指向NULL 的指针。
Avoid crashing when double-freeing pointers.
简短:第二次调用free(),当它设置为NULL 时不会崩溃。
这几乎总是掩盖了一个逻辑错误,因为没有理由再次调用
free()。让应用程序崩溃并能够修复它会更安全。不保证会崩溃,因为有时会在同一地址分配新内存。
双释放主要发生在有两个指针指向同一个地址时。
逻辑错误也可能导致数据损坏。
Avoid reusing freed pointers
简短:如果 malloc() 在同一位置分配内存,则访问已释放的指针可能会导致数据损坏,除非已释放的指针设置为 NULL
如果偏移量足够大(
someStruct->lastMember、theArray[someBigNumber]),不能保证在访问NULL指针时程序会崩溃。不是崩溃,而是数据损坏。将指针设置为
NULL并不能解决指针值相同的不同指针的问题。
问题
这里是a post against blindly setting a pointer to NULL after freeing。
- 哪个更难调试?
- 是否有可能同时捕获两者?
- 此类错误导致数据损坏而不是崩溃的可能性有多大?
请随意扩展这个问题。
【问题讨论】:
-
这篇文章中SO 1879168 的外部引用今天对我来说是坏的——SO 服务器抛出一个 404 页面。你能追踪并更新外部参考吗?或者提供一种或多种替代方案?似乎有很多可供选择。
-
相关(但不是骗子,因为 C != C++):stackoverflow.com/questions/1931126/…
-
@GeorgSchölly "如果
malloc()在同一位置分配内存,访问已释放的指针可能会导致数据损坏,除非已释放的指针设置为NULL" 数据将如何损坏我没有得到。 -
@AbhishekMane 评论部分可能不是进行此类讨论的最佳场所,也许会打开一个新问题?简而言之,不应再使用已释放的指针,因为内存可能会再次被其他内容填充。通过旧指针更改它意味着您更改了代码中其他地方使用的内存。