什么是记忆堆?

H4c*_*0rD 150 malloc

什么是内存堆?

Leo*_*Hat 205

大概你的意思是从内存分配的角度来看,而不是从数据结构的角度来看(这个术语有多重含义).

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

  1. 记忆是free'd
  2. 该计划终止

如果对已分配内存的所有引用都丢失(例如,您不再存储指针),则会出现所谓的内存泄漏.这是仍然分配内存的地方,但你再也没有简单的方法来访问它了.泄漏的内存无法回收用于将来的内存分配,但是当程序结束时,操作系统将释放内存.

将此与堆栈存储器进行对比,堆栈存储器是局部变量(在方法中定义的变量)存在的位置.在堆栈上分配的内存通常仅在函数返回之前存在(对此有一些例外,例如静态局部变量).

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

  • @Imray - 在静态类型语言中,本地参数的大小在编译时是已知的.因此,可以通过地址偏移直接从堆栈中访问局部变量.没有必要弹出堆栈来执行此操作.有关详细信息,请参阅[此答案](http://stackoverflow.com/a/9247682/22489). (8认同)
  • 局部变量如何存在于堆栈中?堆栈仅允许以非常特定的顺序一次获取一个变量.如果我需要从堆栈中较低位置的局部变量怎么办? (3认同)

mjv*_*mjv 15

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


Jus*_*cle 9

内存堆是用于保存动态分配的内存的通用结构.请参阅维基百科上的Dynamic_memory_allocation.

还有其他结构,如池,堆栈和堆.


fas*_*ava 8

堆只是一个没有任何顺序分配或释放内存的区域.当使用new运算符或类似的东西创建对象时会发生这种情况.这与堆栈相反,在堆栈中,在倒数第一个基础上释放内存.


Ign*_*ams 7

它是由进程使用的内存管理器从操作系统分配的一块内存.调用malloc()et alia然后从这个堆中获取内存,而不是直接处理操作系统.


Uri*_*Uri 7

你可能意味着堆内存,而不是内存堆.

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

它与Stack不同,后者分配了"自动变量".因此,例如,当您在C函数中定义指针变量时,在堆栈上分配了足够的空间来容纳内存地址.但是,您经常需要在堆上动态分配空间(使用malloc),然后将此内存块开始的地址提供给指针.