如何修复内存损坏?

时间:2012-08-30 08:23:08

标签: c++ memory-management

我的程序中出现了一些奇怪的,无法解释的错误和崩溃。我一直在调试和环顾四周,我注意到我将变量设置为NULL,但如果我在之后立即设置断点,则变量设置为0xcdcdcd00,即使我将其设置为NULL。

看起来我的程序中发生了某种内存损坏。

找到内存损坏原因的一些好方法是什么?在这个开始发生之前我添加了大量代码,所以在浏览我的代码时,我应该寻找哪些内容会导致内存损坏?

我有一个名为monster的类,派生自一个名为mob

的类

我执行以下代码:

monster* newMon = new monster();

调用怪物类的构造函数:

monster::monster() : mob() {
    this->renderer = NULL;
}

当我在此函数结束时中断时,渲染器= 0xcdcdcd00或有时0xcdcdcdcd

4 个答案:

答案 0 :(得分:1)

你应该给自己一个很好的静态代码检查器,例如gimpel lint(它可以检测很多这类东西),还可以使用valgrind(免费)或者purify或其他一些运行时检查器。

但是,如果将位置设置为零,并且在此之后立即将调试器设置为零,则可能需要确保已关闭优化。即使是稍微优化的代码也会使调试器混淆不堪。

出现的另一个问题是 - 这个代码是多线程的还是您正在检查的内存与另一个进程共享?我怀疑在这种情况下,你需要仔细检查你的代码以检测种族危险,我不知道有什么好的工具。

答案 1 :(得分:1)

monster::monster() : mob() {
    this->renderer = NULL;
}

renderer设置为NULL。我将其改为

monster::monster() : mob(), renderer(NULL) {
}

但这不应该有所作为(除了可读性)。

问题是两件事之一:

  • 过时构建
  • 运行优化并检查调试器中的值(这是我的猜测)。它可能会告诉您renderer不是NULL,但您不应该信任发布版本中的调试器。

我确信如果您输出一些调试语句,您会看到该值实际设置正确:

monster::monster() : mob(), renderer(NULL) {
   if (renderer)
       std::cout << "WTH!";
   else
       std::cout << "correctly set to NULL";
}

答案 2 :(得分:1)

我发现了问题..

我在两个不同的文件中定义了mob类。我不知道我是如何忽视这一点的。

答案 3 :(得分:0)

0xcdcdcdcd经常表示内存未初始化。如果renderer也在基类中,也会发生这种情况。尝试在课程renderer中将m_renderer重命名为monster,看看是否遇到同样的问题。