我在销毁树时删除节点时遇到问题。每个节点都是我的Tree类中定义的结构:
struct node
{
Skill skill;
node** child;
node(const Skill& aSkill): skill(aSkill)
{
child = new node*[CHILD_LIMIT]; // Memory leak happens here
for(int i = 0; i < CHILD_LIMIT; i++)
child[i] = NULL;
}
};
由于每个节点都可以拥有一定数量的节点本身,因此递归对于销毁是有意义的:
Tree::~Tree()
{
DestroyTree(root);
}
void Tree::DestroyTree(node*& root)
{
if(root)
{
for(int i = 0; i < CHILD_LIMIT; i++)
DestroyTree(root->child[i]);
delete root; // Changing this to delete [] root; results in Debug Assertion Failed!
root = NULL;
}
}
此代码可以正常运行,但正如您从我的笔记中看到的那样;在声明指针数组时,我有内存泄漏。根据我的发现,这是因为我应该使用
delete [] root;
而不是
delete root;
但是导致具有表达式的调试断言失败消息:_BLOCK_TYPE_IS_VALID(pHead-&gt; nBlockUse)。我究竟做错了什么?我看到很多关于从n-ary树中删除的信息,还有很多关于删除指针数组的信息,但很难找到两者组合的帮助,奇怪的是。
提前致谢!
答案 0 :(得分:1)
您的数组名为child,因此在实际删除节点之前,需要对此调用数组删除。
void Tree::DestroyTree(node*& root)
{
if(root)
{
for(int i = 0; i < CHILD_LIMIT; i++)
DestroyTree(root->child[i]);
delete [] root->child;
delete root;
root = NULL;
}
}