从n-ary树中删除动态阵列节点时发生错误

时间:2014-03-16 02:11:56

标签: c++ recursion memory-leaks tree dynamic-arrays

我在销毁树时删除节点时遇到问题。每个节点都是我的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树中删除的信息,还有很多关于删除指针数组的信息,但很难找到两者组合的帮助,奇怪的是。

提前致谢!

1 个答案:

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