内存分配(指针和堆栈)

时间:2012-09-25 03:30:28

标签: c++ pointers stack segmentation-fault

我创建了一堆指针,用于创建二叉树。虽然我可以用单个节点填充堆栈,但是在尝试将顶级节点的内存分配给新节点以便我可以创建一个实际的树时,它会发生段错误。举个例子:

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

我不确定我是否误解了它是如何工作的,但由于两者属于同一类型,不应该能够等于堆栈的顶部?我已经被困在这几个小时了。

1 个答案:

答案 0 :(得分:1)

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