【问题标题】:How do i free up memory occupied by a tree?如何释放树占用的内存?
【发布时间】:2014-04-18 02:58:32
【问题描述】:

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

【问题讨论】:

  • 在您使用new[] 创建的所有内容上使用delete[]。你的结构需要一个复制构造函数和赋值运算符。
  • 我没有在任何地方复制,那为什么我需要一个复制构造函数呢?
  • 对于 delete[] ,我将 for 循环替换为 delete[] s->child;但即使这样也不会释放空间。
  • 如果您不在任何地方复制 - 则禁止复制,以免意外编写尝试复制的代码。
  • 您需要自己的复制构造函数。否则编译器会生成一个,这可能不是你喜欢的,并在你不期望它的地方调用它,同上。如果你真的认为你不是在复制,请声明它但不要定义它,或者删除它 (C++11)。

标签: c++ memory memory-management tree


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您想获得真正的技术并练习您的 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?

    只要去找答案。

    【讨论】:

      猜你喜欢
      • 2015-10-26
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多