-1

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

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

找出内存损坏原因的一些好的技术是什么?在这开始发生之前我添加了一大块代码,所以在浏览我的代码时,我应该寻找什么会导致内存损坏?

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

我执行以下代码:

monster* newMon = new monster();

它调用怪物类的构造函数:

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

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

4

4 回答 4

1

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

但是,如果您将位置设置为零并且紧接着调试器说它不为零,您可能需要确保已关闭优化。即使是稍微优化的代码也会使调试器感到困惑,几乎无用。

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

于 2012-08-30T08:29:19.990 回答
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";
}
于 2012-08-30T08:35:07.360 回答
1

我发现了问题。。

mob在两个不同的文件中定义了这个类。我不知道我怎么忽略了这一点。

于 2012-08-30T09:07:06.573 回答
0

0xcdcdcdcd通常表示内存未初始化。如果renderer在基类中也可能发生这种情况。尝试在课堂上重命名renderer为,看看是否遇到同样的问题。m_renderermonster

于 2012-08-30T08:36:25.567 回答