什么是内存堆?


Answers:


234

大概是从内存分配的角度来看,而不是从数据结构的角度看(该术语具有多种含义)。

一个非常简单的解释是,动态分配的内存所在的内存部分(即,通过分配的内存malloc)。从堆分配的内存将保持分配状态,直到发生以下情况之一:

  1. 该存储器是free“d
  2. 程序终止

如果所有对已分配内存的引用都丢失了(例如,您不再存储指向它的指针),那么您将遇到所谓的内存泄漏。这是仍在分配内存的位置,但是您再也没有简单的方法来访问它了。泄漏的内存无法回收用于将来的内存分配,但是在程序结束时,操作系统将释放内存。

与此相比,堆栈内存是局部变量(在方法中定义的变量)所在的地方。通常,在函数返回之前,堆栈上分配的内存通常一直存在(此操作有一些例外,例如静态局部变量)。

您可以在本文中找到有关堆的更多信息。


3
局部变量如何生活在堆栈中?堆栈仅允许一次以非常特定的顺序获取一个变量。如果我需要堆栈中较低位置的局部变量怎么办?
CodyBugstein

9
@Imray-在静态类型语言中,局部参数的大小在编译时已知。因此,可以通过地址偏移量直接从堆栈中直接访问局部变量。无需弹出堆栈即可执行此操作。有关更多详细信息,请参见此答案
LeopardSkinPillBoxHat 2015年

17

内存是内存中可以在随机访问时分配内存的位置。
与按定义的顺序分配和释放内存的堆栈不同,在堆上分配的各个数据元素通常以彼此异步的方式释放。当程序显式释放相应的指针时,将释放所有此类数据元素,这可能会导致碎片化堆。相反,只有顶部(或底部,取决于堆栈的工作方式)的数据可以被释放,从而导致数据元素以相反的顺序被释放。


9

堆只是一个没有任何顺序分配或释放内存的区域。当使用new操作员或类似对象创建对象时,就会发生这种情况。这与在先进先出的基础上释放内存的堆栈相反。




7

您可能是指堆内存,而不是内存堆。

堆内存本质上是一个很大的内存池(通常是每个进程),正在运行的程序可以从中请求块。这通常称为动态分配

它与分配“自动变量”的堆栈不同。因此,例如,当您在C函数中定义指针变量时,将在堆栈上分配足够的空间来保存内存地址。但是,您通常需要在堆上动态分配空间(使用malloc),然后提供该内存块开始到指针的地址。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.