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的项不释放分配的内存,也不调用对象的析构函数。在casestate==8
您的代码:创建新的TreeNodeClass对象,记住指向它的指针并删除此对象,但指向它的指针保存在容器中子对象
。您应该看到我回答的第2点和第4点。在您的情况下,最好的方法是创建节点对象,在不删除的情况下推入子对象
。在子对象附近调用delete。clear()
在两个地方:析构函数和方法CopyIntoMe
。此外,您还应该修复方法CopyIntoMe
(我将在回答中编写示例)说得好。我没有想到这一点。我是从我的OOP培训中来的,我们刚刚在析构函数中删除了所有数据。这是我第一次使用树,因此出现了问题。主要功能只是测试代码。我只是把这部分留给了spirit。有什么简单(或正确)的吗删除存储多个指针的容器的方法?我假设使用delete调用,然后为容器中的每个n将指针设置为NULL。清除时的容器为每个项调用析构函数。在这种情况下,类型为pointer和pointer的项不释放分配的内存,也不调用对象的析构函数。在casestate==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;