gpt4 book ai didi

c++ - 从 n-ary 树中删除动态数组节点时断言错误

转载 作者:太空宇宙 更新时间:2023-11-04 11:38:02 25 4
gpt4 key购买 nike

我在销毁树时遇到删除节点的问题。每个节点都是在我的 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->nBlockUse)。我究竟做错了什么?我看到了很多关于从 n 元树中删除的信息,还有很多关于删除指针数组的信息,但奇怪的是,我很难找到有关两者组合的帮助。

提前致谢!

最佳答案

您的数组称为子数组,因此您需要在实际删除节点之前对此调用数组删除。

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;
}
}

关于c++ - 从 n-ary 树中删除动态数组节点时断言错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22432181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com