我的程序中出现了一些奇怪的,无法解释的错误和崩溃。我一直在调试和环顾四周,我注意到我将变量设置为NULL,但如果我在之后立即设置断点,则变量设置为0xcdcdcd00
,即使我将其设置为NULL。
看起来我的程序中发生了某种内存损坏。
找到内存损坏原因的一些好方法是什么?在这个开始发生之前我添加了大量代码,所以在浏览我的代码时,我应该寻找哪些内容会导致内存损坏?
我有一个名为monster
的类,派生自一个名为mob
我执行以下代码:
monster* newMon = new monster();
调用怪物类的构造函数:
monster::monster() : mob() {
this->renderer = NULL;
}
当我在此函数结束时中断时,渲染器= 0xcdcdcd00
或有时0xcdcdcdcd
答案 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
,看看是否遇到同样的问题。