【发布时间】:2011-12-09 13:38:59
【问题描述】:
我遇到的问题是在删除二叉树节点期间收到堆损坏消息。消息说:
HEAP[lab4.exe]: HEAP: Free Heap block 5788c0 在 5788e8 后修改 它被释放了 Windows 在lab4.exe 中触发了一个断点。
这可能是由于堆损坏,这表明存在错误 lab4.exe 或它已加载的任何 DLL。
这也可能是由于用户按 F12 而 lab4.exe 有 重点。
听起来我正在写入已释放的内存块。 Valgrind 似乎通过以下消息证实了这一点:
大小为 4 的无效写入
在 0x8049C65:> BinTree::removeTree(BinTree::Node*) (in/net/metis/home2/alexo2/lab4/a.out)
...
==9681== 地址 0x402ab50 在大小为 12 的块内是 0 个字节
在 0x40054B4: 运算符删除(void*) (vg_replace_malloc.c:346) 由 0x8049C61: BinTree::removeTree(BinTree::Node*) (在 /net/metis/home2/alexo2/lab4/a.out)
...
当我跟踪程序时,堆损坏消息通常始于父类或基类析构函数。我一直在尝试追踪这个,但我不知道问题出在哪里。在析构函数之前,我从不在这些节点上使用 delete。
我怀疑问题与我删除或跟踪二叉树的方式有关。这是我将发布的一些代码,不确定它是否有助于找到解决方案。
因此,类对象是由函数动态分配和返回的。这个对象被指针跟踪,直到它最终被插入到二叉树的节点中。 在程序结束时,当所有内容都被删除时,会调用析构函数:
void BinTree::makeEmpty()
{
if ( root != NULL ) {
removeTree( root );
}
root = NULL;
}
void BinTree::removeTree( Node *curr )
{
if ( curr == NULL )
return;
removeTree( curr->left );
removeTree( curr->right );
delete curr->data;
delete curr;
curr->data = NULL;
curr = NULL;
}
在某些函数中,这是创建并返回动态分配对象的调用:
Item *aMovie = factory.createMovie( code.c_str() );
仅在部分节点上,而不是所有节点上,当达到 delete curr->data 时,它所指向的对象的析构函数被调用,然后是父类的析构函数,最后是基类析构函数(它们都是空的)。有时它在父析构函数中,有时在基类析构函数中显示堆损坏消息。
关于问题可能源于什么的任何建议?
【问题讨论】:
标签: c++ pointers delete-operator heap-corruption