我已经创建了一个堆栈指针,它被用来创建一个二进制树。虽然我可以用单个节点填充堆栈,但在尝试将顶层节点的内存分配给新节点时,我可以创建一个实际的树,它会发生段错误。举个例子:内存分配(指针和堆栈)
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分配内存,将其称为构造函数,并将该内存块的地址分配给指针。
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
您刚刚泄露存储在两个短行。 – chris
什么是堆栈的类型,你如何填充它? –
堆栈正在使用类型的模板,并在分配根节点某些数据后通过推送根节点来填充它。如果你想让我把它放在那里,我会的。 –