内存分配(指针和堆栈)

Posted

技术标签:

【中文标题】内存分配(指针和堆栈)【英文标题】:Memory Allocation (Pointers and Stacks) 【发布时间】:2012-09-16 13:11:55 【问题描述】:

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

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

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

【问题讨论】:

你刚刚泄露了两行内存。 栈是什么类型的,你是怎么填的? 堆栈使用模板作为类型,我在为根节点分配一些数据后通过推送根节点来填充它。如果你想让我把它放在那里,我会的。 从克里斯的观点来看,我想说你在第二段引出的辩论已成定局。也许在多花一点时间后,会更清楚该做什么(和不做什么)。 取决于栈的实现,如果栈是空的,你尝试top它,它可能正在访问一个虚假的指针。 【参考方案1】:

我认为您误解了指针在 C++/C 中的工作方式。它们只是表示内存地址的整数值。 new 关键字为类分配内存,然后调用该类的构造函数。

所以从你写的内容来看

TreeNode *c = new TreeNode;

为 Treenode 分配一个指针。然后为 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

【讨论】:

啊,那也没用,但是感谢您的教程。上帝知道我需要一个。 @BrandinJefferson 我认为本教程可能会有所帮助。从 C 指针开始是对任何先前语言 Brandin 的转变,尤其是垃圾收集语言。我们都做了这么久,就像呼吸一样;自动的。花一些时间。这是值得的。 问题出在 stack.top() 或程序结束时堆栈的破坏中,而不是您发布的代码中。学习教程。

以上是关于内存分配(指针和堆栈)的主要内容,如果未能解决你的问题,请参考以下文章

内存分配 保存数据

为什么我们不能在堆栈上分配动态内存?

[Java]程序运行时的内存分配

内存中的字符串文字在哪里?堆栈/堆? [复制]

使用 'push' 或 'sub' x86 指令时如何分配堆栈内存?

函数内的指针变量指向堆栈还是堆?