如何释放树占用的内存?

时间:2014-04-17 06:14:50

标签: c++ memory memory-management tree

我树中的每个节点都有M个孩子。其中一些可能是NULL。在我完成树之后,我递归地遍历树的每个元素并删除它,但这不会释放程序使用的内存。首先,我在没有定义析构函数的情况下尝试了这个,然后在定义析构函数之后也无济于事。请告诉我释放内存空间的错误。我删除树的代码如下: -

void deleteTree(node* s)
{
    if(s==NULL)
        return ;
    else
    {
        for (int i=0 ; i < M ; i++)
        {
            deleteTree(s->child[i]);
        }
        delete(s);
    }
}

节点包含字符串向量,整数数组和指向其子节点的指针数组。

struct node 
{
    vector<string> stateBoard;
    int Nstate;
    int *NstateAction;
    node** child;
    int depth;
    double Q;
    double *Qvalue;

    node()
    {
        Nstate=0;
        depth = 0;
        NstateAction = new int[M];
        Qvalue = new double[M];
        child = new node *[M];                          //
        for( int i=0 ; i < M ; i++)
        {
            NstateAction[i] = 0;
            child[i]=NULL;
        }
    }
    ~node()
    {
        stateBoard.clear();
        vector<string>(stateBoard).swap(stateBoard);
    }
};

2 个答案:

答案 0 :(得分:2)

删除它。删除节点子节点的部分应该在节点类的析构函数中,而不是在外部。如果你没有把它放在那里,删除不是递归的,所以你将泄漏孙子节点及其子树。

答案 1 :(得分:1)

如果你想获得真正的技术并练习你的C ++ 11,我会建议使用智能指针。为了清楚起见,我会将所有销毁机制都放到析构函数中,但智能指针对c ++来说是一件好事,所以练习时你应该使用它们。

所以你应该声明这样的东西:

//don't forget to #include<memory>
std::unique_ptr<int> NstateAction;
//don't use vectors as arrays, if the standard library has an alternatve you should use it
std::vector<unique_ptr<int>> child;
std::unique_ptr<double> QValue; 

智能指针是一些指针,当它们超出范围时会自动释放内存,所以这应该可以解决问题。

现在使用智能指针有点棘手,但这是一个有用的问题:

c++ - How can i initialize a smart point using a naked new?

回答问题。