如何释放被树占用的内存

How do i free up memory occupied by a tree?

本文关键字:内存 何释放 释放      更新时间:2023-10-16

树中的每个节点都有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);
    }
};

只需删除即可。删除节点子级的部分应该在节点类的析构函数中,而不是在外部。如果你不把它放在那里,删除不是递归的,所以你会泄露孙节点及其子树。

如果你想真正掌握技术并练习你的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++-如何使用裸新初始化智能点?

只需找到答案。