用于销毁通用树c ++的递归函数

时间:2014-08-14 04:55:12

标签: c++ recursion tree

到目前为止,我的DestroyTree函数可以在SkillTree析构函数中调用:

void SkillTree::DestroyTree(Node*& root)
{

  if(root)
  {
      for(int i = 0; i < child_max && root && root->child[i]; ++i)
      {
          if(root)
          {
              DestroyTree(root->child[i]);
              delete root;
              root = NULL;
          }
      }

  }

}

对于root上的所有检查我有点尴尬,但我只是想让它工作。

如果有帮助,这里也是我的班级定义的一部分......

class SkillTree
{
  public:
    SkillTree(void);
    ~SkillTree(void);   

  protected:
    struct Node
    {
       Node() : max(DEFAULT_CHILD_MAX), child(new Node*[DEFAULT_CHILD_MAX])
        {
            for(int i = 0; i < max; ++i)
                child[i] = NULL;
        }

       ~Node()
       {
           for(int i = 0; i < max; ++i)
               delete child[i];

           child = NULL;
       }

       int max;
       Skill data;
       Node** child;    //a dynamic array of child pointers
    };

    void DestroyTree(Node*& root);

    int child_max;
    const static int DEFAULT_CHILD_MAX = 3;
    char* title;
    Node* root;
};

我认为除了三分之一以外,最左边的节点和其他孩子一起被删除。我知道我有内存泄漏,所以我希望如果我修复了这个问题,那么我的内存泄漏问题也会得到解决。

3 个答案:

答案 0 :(得分:1)

DestroyTree函数应如下所示:

void SkillTree::DestroyTree()
{
    if (root)
    {
        delete root;
        root = NULL;
    }
}

和这样的Node析构函数:

Node::~Node()
{
    for (size_t i = 0; i < max; ++i)
    {
        if (child[i])
            delete child[i];
    }
    delete [] child;
}

列出每次更改的原因有点长。如果有什么不清楚的地方,请随时询问!

答案 1 :(得分:0)

您遇到的问题是,无论根节点有多少子节点,它都只会迭代(并递归)一次

原因?您删除并重置循环内的root指针,并使root指针成为循环的条件。

您应该只对root的初始检查为非空,然后在循环后删除/重置

答案 2 :(得分:0)

您应该在Node析构函数中使用delete[] child;而不是删除单个子项。这是因为child是使用new[]构建的。不这样做会导致未定义的行为。