我创建了一堆指针,用于创建二叉树。虽然我可以用单个节点填充堆栈,但在尝试将顶部节点的内存分配给一个新节点以便我可以创建一个实际的树时,它会出现段错误。举个例子:
TreeNode *c = new TreeNode;
c = stack.top(); //this segfaults
我不确定我是否误解了它是如何工作的,但由于两者都是同一类型,c 不应该能够等于堆栈的顶部吗?我已经坚持了几个小时了。
我创建了一堆指针,用于创建二叉树。虽然我可以用单个节点填充堆栈,但在尝试将顶部节点的内存分配给一个新节点以便我可以创建一个实际的树时,它会出现段错误。举个例子:
TreeNode *c = new TreeNode;
c = stack.top(); //this segfaults
我不确定我是否误解了它是如何工作的,但由于两者都是同一类型,c 不应该能够等于堆栈的顶部吗?我已经坚持了几个小时了。
我认为您误解了指针在 C++/C 中的工作方式。它们只是表示内存地址的整数值。关键字为类分配内存,new
然后调用该类的构造函数。
所以从你写的
TreeNode *c = new TreeNode;
为 Treenode 分配一个指针。然后为 Treenode 分配内存,调用它的构造函数并将这个内存块的地址分配给指针。
c = stack.top(); //this segfaults
获取函数调用stack.top()返回的地址/指针值,赋值给变量c。
正如克里斯所说,即使您的代码已经工作,它也是一个泄漏,因为在 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