我创建了一个指针堆栈,用于创建一个二进制树。虽然我可以用单个节点填充堆栈,但在尝试将顶部节点的内存分配给一个新节点以便创建一个实际的树时,它会segfault。例如:
TreeNode *c = new TreeNode;
c = stack.top(); //this segfaults
我不确定我是否误解了这是如何工作的,但既然两者都是同一类型,c不应该等于堆栈的顶部吗?我已经被这个问题困扰了好几个小时了。
我认为您误解了指针在C++中的工作方式。它们只是表示内存地址的整数值。new
关键字为一个类分配内存,然后调用该类的构造函数。
所以根据你写的
TreeNode *c = new TreeNode;
为树节点分配一个指针。然后为树节点分配内存,调用它的构造函数,并将该内存块的地址分配给指针。
c = stack.top(); //this segfaults
获取函数调用stack.top()返回的地址/指针值,并将其分配给变量c.
正如chris所说,即使你的代码已经工作了,它也是一个泄漏,因为c++中没有垃圾收集器,所以当你执行c=stack.top()时,之前分配的内存就会在堆上丢失。
任一
Treenode *c = new Treenode;
delete c;
c = stack.top();
或
Treenode *c = stack.top();
您可以观察到的问题是在某个地方调用stack.top()。我建议你做这样的指针教程。
http://www.codeproject.com/Articles/627/A-Beginner-s-Guide-to-Pointers