回答
你只是(非)幸运。该代码表现出未定义的行为 - 任何事情都可能发生,包括看起来内存未被释放。
内存是已释放,但没有积极清除它的意义,所以它的原始内容可能仍然存在。但你不能依赖这一点。
这就是所谓的未定义行为。您正在解引用指向释放内存的指针。任何事情都可能发生,也就是说,不能认为程序会崩溃或其他任何事情;行为是undefined。
只要str
不NULL
和相应的内存没有被一些其他配置覆盖它仍然有效,因为内存的内容不受到free
改变(如果运行时不会覆盖上free
存储区域) 。但这是明确的未定义的行为,你不能依靠它来这样工作...
嗯,它*可以*由'free()'改变。关键是这个程序的行为是不确定的。 –
@EdS。这是我在最后一句中写的! – Yahia
你在事后补充说。我低估了你原来的帖子。如果你不想downvotes不急于它:) Downvote删除 –
这里有一个比喻为你:想象你租用一个公寓(这是内存),你终止你的租约,但保持重复(这是指针)。你可能如果它还没有被拆除,如果锁没有被改变等,并且如果你马上去做可能可以找到你离开的方式他们。但是,这是一个非常糟糕的主意,并在可能的情况下,你要自己弄一堆麻烦......
+1。 – Dani
事情要记住...
- 几乎所有当前的操作系统,
free()
永远不会返回 内存到操作系统。即使它理论上有能力,它几乎不会实际发生。这是因为内存 只能以对齐的页面返回,通常为4kB,因为MMU的工作方式就是这样,而且如果找到其中的一个,则将其拆分出来可能会将包含高于和低于其的内存的块分段,使整个过程适得其反。 (碎片化是动态内存高效利用的敌人。) - 此外,大多数程序只是使用更多的内存,所以花费的时间搜索的东西真的 返回到操作系统将被完全浪费。如果它没有返回到 操作系统,然后受到保护,那么当您触摸它时,它不会核心您的程序。
- 所以相反,会发生什么是 你给的空闲块只是放在一个列表或其他一些 数据结构,然后可能合并到其上方或下方的块。
- 内存仍然存在并且可以访问。某些块可能是 ,它们覆盖在malloc()和free()后面的库代码 的指针和其他内部部分。但它可能不是。
- 最终它可能是 在您的程序的其他地方回传。但它可能不是。
- 1. 免费cv ::垫没有释放内存
- 2. 如何在不使用免费()的情况下释放内存
- 3. 如何为队列释放内存?矿不免费
- 4. malloc和免费的D /探戈不释放内存?
- 5. 有免费()释放内存不起作用
- 6. MATLAB中的免费()和mxFree() - 两次释放内存
- 7. 免费如何知道要释放的内存大小?
- 8. 免费()造成麻烦时,一个子进程释放内存
- 9. 免费的免费动态内存()
- 10. 内存不释放
- 11. 内存不释放
- 12. [字节]是否自动释放内存而不必使用免费?
- 13. window.URL.revokeObjectURL()不立即释放内存(或根本不释放内存)?
- 14. 即使我明确释放内存,内存也不会释放
- 15. 释放内存
- 16. 释放内存
- 17. 使用免费删除对象释放内部对象
- 18. 内存泄漏C免费()
- 19. Doctrine2 ODM免费内存
- 20. 免费Hashtable的内存
- 21. 内存错误与免费()
- 22. 免费物理内存
- 23. C内存免费混淆
- 24. 芹菜不释放内存
- 25. MySQL不释放内存
- 26. 的Cocos2D:particle.autoRemoveOnFinish不释放内存
- 27. MySQL不释放内存
- 28. PipelineBuffer不释放内存
- 29. 线程不释放内存
- 30. dismissModalViewController不释放内存
你预期会发生什么? –
你之前用'str'做过什么? – qwertz
强制链接:http://stackoverflow.com/a/6445794/11683 – GSerg