2012-09-25 220 views
-1

我已经创建了一个堆栈指针,它被用来创建一个二进制树。虽然我可以用单个节点填充堆栈,但在尝试将顶层节点的内存分配给新节点时,我可以创建一个实际的树,它会发生段错误。举个例子:内存分配(指针和堆栈)

TreeNode *c = new TreeNode; 
c = stack.top(); //this segfaults 

我不知道如果我误解是如何工作的,但由于两者都是同一类型的,应该不是C能够等于堆栈的顶部?我一直坚持这几个小时。

+5

您刚刚泄露存储在两个短行。 – chris

+0

什么是堆栈的类型,你如何填充它? –

+0

堆栈正在使用类型的模板,并在分配根节点某些数据后通过推送根节点来填充它。如果你想让我把它放在那里,我会的。 –

回答

1

我认为你误解了指针在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

+0

啊,这也没有用,但感谢教程。上帝知道我需要一个。 –

+0

@BrandinJefferson我认为这个教程可能会帮助很多人。从C-pointers开始就是从任何先前的语言Brandin中转移出来的,特别是收集到的垃圾。我们都做了这么久,就像呼吸一样;自动。需要一些时间。这很值得。 – WhozCraig

+0

问题出在stack.top()上,或者在程序结束时销毁堆栈,而不是发布的代码中。在教程中有一个破解。 – wadge