C++;树指针错误 我试图找出如何在C++中创建树。我已经试着调试了几个小时,我想是时候让我有另一双眼睛了。我的问题是我的treeNodeClass看起来是否正确。现在我得到了一个堆栈爆炸,因为我从我的节点上双重删除项目。树本身将解析一个简单的xml文件。这是我的密码

C++;树指针错误 我试图找出如何在C++中创建树。我已经试着调试了几个小时,我想是时候让我有另一双眼睛了。我的问题是我的treeNodeClass看起来是否正确。现在我得到了一个堆栈爆炸,因为我从我的节点上双重删除项目。树本身将解析一个简单的xml文件。这是我的密码,c++,pointers,tree,runtime-error,C++,Pointers,Tree,Runtime Error,#包括“treeNodeClass.h” TreeNodeClass::TreeNodeClass() { 不能1.孩子不应该删除父母: TreeNodeClass::~TreeNodeClass() { cout << "TREENODECLASS::~TREENODECLASS()" << endl; /* Delete next 2 lines if(parent) delete parent; */


#包括“treeNodeClass.h”

TreeNodeClass::TreeNodeClass()
{

不能1.孩子不应该删除父母:

TreeNodeClass::~TreeNodeClass()
{
      cout << "TREENODECLASS::~TREENODECLASS()" << endl; 
      /* Delete next 2 lines
      if(parent)
        delete parent;
      */
      parent = NULL; 
      children.clear(); 
      attributes.clear();
      cout << "EXIT TREENODECLASS::~TREENODECLASS()" << endl;
}

1.子女不应删除父母:

TreeNodeClass::~TreeNodeClass()
{
      cout << "TREENODECLASS::~TREENODECLASS()" << endl; 
      /* Delete next 2 lines
      if(parent)
        delete parent;
      */
      parent = NULL; 
      children.clear(); 
      attributes.clear();
      cout << "EXIT TREENODECLASS::~TREENODECLASS()" << endl;
}
这很糟糕:

parent = new TreeNodeClass;
parent = p; 
这是内存泄漏。由于您正在分配内存并将父级指向它,然后立即将父级指向其他对象,因此您永远无法删除分配的内存。每次调用AddParent()时,内存都将被分配并丢失。

这很糟糕:

parent = new TreeNodeClass;
parent = p; 

这是内存泄漏。由于您正在分配内存并将父级指向它,然后立即将父级指向其他内容,因此您永远无法删除分配的内存。每次AddParent()时,内存都将被分配并丢失是调用的。

很好。我没有想到这一点。我是从我的OOP培训中来的,我们刚刚在析构函数中删除了所有数据。这是我第一次使用树,因此出现了问题。主要功能只是测试代码。我只是把这部分留给了spirit。有什么简单的(或正确的)方法吗删除存储多个指针的容器的方法?我假设使用delete调用,然后为容器中的每个n将指针设置为NULL。清除时的容器为每个项调用析构函数。在这种情况下,类型为pointer和pointer的项不释放分配的内存,也不调用对象的析构函数。在case
state==8
您的代码:创建新的TreeNodeClass对象,记住指向它的指针并删除此对象,但指向它的指针保存在容器中
子对象
。您应该看到我回答的第2点和第4点。在您的情况下,最好的方法是创建节点对象,在不删除的情况下推入
子对象
。在
子对象附近调用delete。clear()
在两个地方:析构函数和方法
CopyIntoMe
。此外,您还应该修复方法
CopyIntoMe
(我将在回答中编写示例)说得好。我没有想到这一点。我是从我的OOP培训中来的,我们刚刚在析构函数中删除了所有数据。这是我第一次使用树,因此出现了问题。主要功能只是测试代码。我只是把这部分留给了spirit。有什么简单(或正确)的吗删除存储多个指针的容器的方法?我假设使用delete调用,然后为容器中的每个n将指针设置为NULL。清除时的容器为每个项调用析构函数。在这种情况下,类型为pointer和pointer的项不释放分配的内存,也不调用对象的析构函数。在case
state==8
您的代码:创建新的TreeNodeClass对象,记住指向它的指针并删除此对象,但指向它的指针保存在容器中
子对象
。您应该看到我回答的第2点和第4点。在您的情况下,最好的方法是创建节点对象,在不删除的情况下推入
子对象
。在
子对象附近调用delete。clear()
在两个地方:析构函数和方法
CopyIntoMe
。此外,您还应该修复方法
CopyIntoMe
(我将在回答中编写示例)还有在
CopyIntoMe
方法中。哇,我真不敢相信我错过了。出于某种原因,我忘记了父对象在类中。如果我将父对象指定给p,则只会复制正确的指针?(指针已经有一段时间了)。是的,它将使父对象成为传递到TreeNodeClass中的指针。在
CopyIntoMe
方法中也是如此。哇,我真不敢相信我错过了。出于某种原因,我忘记了父对象在类中。如果我将父对象指定给p,则只会复制正确的指针?(指针已经有一段时间了)。是的,它将使父级成为指向传入TreeNodeClass的指针。
void TreeNodeClass::CopyIntoMe(const TreeNodeClass& other)
{
  cout << "Copy into me" << endl;
  tag = other.tag; 
  data = other.data; 
  attributes = other.attributes; 

  // delete each pointer to Nodes
  foreach (vector<TreeNodeClass*>::iterator child = children.begin(); child != children.end(); ++child)
    delete *child;
  children.clear();

  // Copy recursively each child
  foreach (vector<TreeNodeClass*>::iterator child = other.children.begin(); child != other.children.end(); ++child) {
    TreeNodeClass* new_child = new TreeNodeClass;
    new_child->CopyIntoMe(*child);
    children.push_back(new_child);
  }

  parent = other.parent; 
  height = other.height; 
}
parent = new TreeNodeClass;
parent = p;