亲爱的 g++ 黑客,我有以下问题。
当一个对象的某些数据被错误的程序覆盖时,为什么程序最终会在销毁该对象时失败并出现双重释放错误?它如何知道数据是否损坏?为什么会导致双重免费?
通常不是对象的内存被覆盖,而是对象之外的部分内存。如果这击中了 malloc 的控制结构,free 将在访问它们并尝试根据损坏的结构做奇怪的事情时吓坏了。
如果你真的只是用愚蠢的东西覆盖对象内存,那么 malloc/free 就不会知道。您的程序可能会崩溃,但出于其他原因。
看看valgrind。它是一个模拟 CPU 并监视每个内存访问是否存在异常的工具(例如尝试覆盖 malloc 的控制结构)。它真的很容易使用,大多数时候你只是在 valgrind 中通过预先valgrind
在 shell 上启动你的程序,它为你节省了很多痛苦。
关于 C++:始终确保将 new 与 delete 结合使用,并且分别将 new[] 与 delete[] 结合使用。永远不要把它们混在一起。坏事会发生,通常与您所描述的相似(但 valgrind 会警告您)。