1

亲爱的 g++ 黑客,我有以下问题。

当一个对象的某些数据被错误的程序覆盖时,为什么程序最终会在销毁该对象时失败并出现双重释放错误?它如何知道数据是否损坏?为什么会导致双重免费?

4

1 回答 1

3

通常不是对象的内存被覆盖,而是对象之外的部分内存。如果这击中了 malloc 的控制结构,free 将在访问它们并尝试根据损坏的结构做奇怪的事情时吓坏了。

如果你真的只是用愚蠢的东西覆盖对象内存,那么 malloc/free 就不会知道。您的程序可能会崩溃,但出于其他原因。

看看valgrind。它是一个模拟 CPU 并监视每个内存访问是否存在异常的工具(例如尝试覆盖 malloc 的控制结构)。它真的很容易使用,大多数时候你只是在 valgrind 中通过预先valgrind在 shell 上启动你的程序,它为你节省了很多痛苦。

关于 C++:始终确保将 new 与 delete 结合使用,并且分别将 new[] 与 delete[] 结合使用。永远不要把它们混在一起。坏事会发生,通常与您所描述的相似(但 valgrind 会警告您)。

于 2008-11-25T11:10:32.460 回答