如何修复c / c ++中的堆损坏?

时间:2010-10-10 11:08:10

标签: c++ c heap-corruption

这是我之前的here的另一个问题。

对此有一般的解决方案吗?

3 个答案:

答案 0 :(得分:8)

  • 修复所有悬空指针
  • 修复所有缓冲区溢出
  • 仅在真正需要的地方使用指针

答案 1 :(得分:1)

阅读你原来的帖子我不是100%你面临堆腐败,你真的希望你不要因为如果你认为这是追踪和AFAIK最棘手的错误之一就没有解决方案永远都有效。

但是,如果你肯定它是一个堆腐败,并且你在Windows平台上,你可以尝试使用工具gflags。此高级调试工具允许您安装调试堆管理器,以便能够找到某些类型的堆损坏。它有一个很好的选择,就是在它自己的页面中进行每次分配,或者写保护堆数据结构。这样可以更容易地确定堆损坏的确切位置。它吸收了大量的内存和CPU。

如果您使用Visual Studio,另一个提示是,如果您在特定时间点之后设法发现某些内容正在破坏数据并且您希望找到破坏数据的代码,则可以使用Data Breakpoint在某人时断开更改有问题的数据。

祝你好运。

答案 2 :(得分:1)

添加到swegi的答案我将检查所有C ++构造函数和所有C初始化。将所有动态C ++构造函数(将init代码放在函数体中的构造函数)转换为静态构造函数(使用特殊构造函数语法初始化)。并确保将所有指针和指针成员初始化为0。对于C,我会初始化所有变量。

然后,在unix上我会使用valgrind,通常这对于查找所有访问冲突非常有用,并且如果使用所有调试选项进行编译,则可以将其跟踪到源代码行。 Windows上也应该有类似的东西。