【发布时间】:2010-12-10 00:50:33
【问题描述】:
我遇到了一个严重的错误。当我在对象层次结构顶部的对象上调用 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;
}
这可能与返回在静态方法的堆栈空间中初始化的指针有关吗?我正确地删除了吗?关于我可以检查或做得更好的任何其他提示?
【问题讨论】:
标签: c++ memory-management destructor glibc