究竟是什么,与".Net"有关的"堆栈"

Rob*_* P. 8 .net vb.net stack

如果这是一个愚蠢的问题,请原谅我,但我担心我不知道'堆栈'是什么.

我知道'堆栈'是什么,我已经学会了FILO/FIFO的首字母缩略词.但是当人们说'价值类型被分配在堆栈而不是堆上'时,我恐怕我真的不知道这意味着什么.

当我将一个逻辑错误引入递归函数时 - 我无法再为"堆栈"分配更多内存而我的应用程序崩溃了....但我真的不知道它是什么.

我试图谷歌寻求答案,但只找到关于'堆栈'的信息以及如何使用它.

当我运行.Net应用程序时 - 是否会创建一个"堆栈实例"来充当"堆栈"?我已经看到Stack跟踪向我展示了代码的执行级别 - 最常见的是当我遇到一个无法处理的异常时...但我记得能够看到的是方法和它们被调用的顺序......不会堆栈的每个步骤的范围内也包含所有变量.

也许我只是愚蠢 - 但我认为我可以想象一个具有递归函数的情况,它可以方便地查看变量的先前值 - 来自"堆栈"但不需要传递它.

Dunno,如果这有任何意义 - 这是非常晚.但我真的很感激任何人的信息.

Sap*_*pph 18

该术语指的是调用堆栈.您可以了解有关低级编程或计算机体系结构/组织课程中的概念的更多信息,您可以选择一个.

每当调用一个函数时,返回地址(它被调用的地方)以及函数的参数都被推送到"堆栈"(内存中的堆栈,但不是,不是你的C#堆栈数据结构) d阅读有关MSDN的信息).当函数终止时,地址将从堆栈中弹出,控件将恢复原来的位置(在弹出的地址处).与函数调用有关的信息(局部变量,返回地址,参数等)称为"堆栈帧".

因此,当您使用递归(并且它被无限递归循环捕获)时,您实际上只是用返回地址(和其他数据)填充堆栈,直到没有剩余空间.

编辑 - 你也提到了堆.这是存储数据结构的地方(动态内存分配,现在通过new大多数语言中的关键字,或malloc在C中).例如,在C/C++中,堆上的数据一直存在,直到它被显式释放.这与存储在堆栈中的本地/自动变量形成对比(因此当它们的作用域终止时会被销毁......它们会从堆栈中弹出而不存在).

  • 请注意,在C#和VB.NET中,"new"并不意味着堆分配,因为它也用于调用值类型构造函数 - 值类型值在堆栈或堆上发生,具体取决于上下文. (2认同)