我遇到了一个严重的错误。当我在对象层次结构顶部的对象上调用 delete 时(希望导致其子对象的删除),我的程序退出,我得到了这个:
*** 检测到 glibc *** /home/mossen/workspace/abbot/Debug/abbot: double free or corruption (out): 0xb7ec2158 ***
其次是看起来像是某种内存转储的东西。我已经搜索过这个错误,从我收集的信息来看,它似乎是在您尝试删除已删除的内存时发生的。不可能,因为我的代码中只有一个地方尝试删除。这是古怪的部分:它不会在调试模式下发生。有问题的代码:
Terrain::~Terrain()
{
if (heightmap != NULL) // 'heightmap' is a Heightmap*
{
cout << "heightmap& == " << heightmap << endl;
delete heightmap;
}
}
我已经注释掉了高度图析构函数中的所有内容,但仍然是这个错误。当错误发生时,
高度图& == 0xb7ec2158
被打印。在调试模式下,我可以慢慢地单步执行代码
高度图& == 0x00000000
已打印,并且没有错误。如果我注释掉“删除高度图;” 行,永远不会发生错误。上面的析构函数是从另一个析构函数调用的(单独的类,没有虚拟析构函数或类似的东西)。高度图指针在这样的方法中是新的:
Heightmap* HeightmapLoader::load() // a static method
{
// ....
Heightmap* heightmap = new Heightmap();
// ....other code
return heightmap;
}
这可能与返回在静态方法的堆栈空间中初始化的指针有关吗?我正确地删除了吗?关于我可以检查或做得更好的任何其他提示?