2008-11-25 93 views
1

亲爱的g ++黑客,我有以下问题。关于g ++生成代码的问题

当一个对象的某些数据被一个错误的程序覆盖时,为什么程序最终无法通过一个双重自由错误破坏该对象?它如何知道数据是否被破坏?为什么它会导致双重自由?

+0

请选择一个更具描述性的标题 – hop 2008-11-25 11:11:13

回答

3

通常不是对象的内存被覆盖,而是对象外部的部分内存。如果这个命中了malloc的控制结构,free会在它访问它们并且试图根据被破坏的结构做怪异的事情时吓坏了。

如果你真的只用愚蠢的东西覆盖对象内存,malloc/free就不会知道。您的程序可能会崩溃,但出于其他原因。请参阅valgrind。它是一个模拟CPU并监视每个异常存储器访问的工具(如试图覆盖malloc的控制结构)。使用起来非常简单,大多数情况下,只需在shell中加入valgrind即可在valgrind中启动程序,并为您节省很多痛苦。

关于C++:总是请确保您将delete与new []和delete []结合使用。切勿混淆。坏事会发生,通常与你所描述的相似(但valgrind会警告你)。