什么是内存堆?
答案 0 :(得分:181)
从内存分配的角度来看,大概是指 heap ,而不是从数据结构的角度来看(该术语有多重含义)。
一个非常简单的解释是堆是动态分配内存所在的内存部分(即通过malloc
分配的内存)。从堆分配的内存将保持分配状态,直到出现以下情况之一:
free
'd 如果对已分配内存的所有引用都丢失(例如,您不再存储指针),则会出现所谓的内存泄漏。这是仍然分配内存的地方,但你再也没有简单的方法来访问它了。泄漏的内存无法回收用于将来的内存分配,但是当程序结束时,内存将被操作系统释放。
将此与堆栈内存进行对比,后者是局部变量(方法中定义的变量)的存储位置。在堆栈上分配的内存通常只能在函数返回之前存在(对此有一些例外,例如静态局部变量)。
您可以在this article中找到有关堆的更多信息。
答案 1 :(得分:12)
内存 堆 是内存中可以随机访问分配内存的位置。
与 堆栈 在以非常明确的顺序分配和释放内存的情况下,在堆上分配的各个数据元素通常以彼此异步的方式释放。当程序显式释放相应的指针时,释放任何此类数据元素,这可能导致碎片堆。相反,只有顶部(或底部,取决于堆栈工作方式)的数据可能被释放,导致数据元素按照它们被分配的相反顺序被释放。
答案 2 :(得分:7)
内存堆是用于保存动态分配的内存的常用结构。 请参阅维基百科上的Dynamic_memory_allocation。
还有其他结构,如水池,堆栈和堆。
答案 3 :(得分:6)
你可能意味着堆内存,而不是内存堆。
堆内存本质上是一个大型内存池(通常是每个进程),正在运行的程序可以从中请求块。这通常称为dynamic allocation。
它与Stack不同,后者分配了“自动变量”。因此,例如,当您在C函数中定义指针变量时,在堆栈上分配了足够的空间来容纳内存地址。但是,您经常需要在堆上动态分配空间(使用malloc),然后将此内存块开始的地址提供给指针。
答案 4 :(得分:6)
堆只是在没有任何顺序的情况下分配或取消分配内存的区域。当使用new
运算符或类似的东西创建对象时会发生这种情况。这与堆栈相反,在堆栈中,在倒数第一个基础上释放内存。
答案 5 :(得分:5)
这是由进程使用的内存管理器从操作系统分配的一块内存。调用malloc()
等等,然后从这个堆中获取内存,而不是直接处理操作系统。
答案 6 :(得分:-1)
每个正在运行的进程都有自己的私有虚拟内存,由操作系统提供。 只要可用,操作系统可以随时将其映射到物理内存,否则它将根据需要映射到磁盘和交换。 这个虚拟内存在逻辑上被划分为用于组织不同类型数据的段。 代码段保存可执行指令。 数据段保存静态数据,例如全局或静态变量。 堆栈保存由调用和返回函数自动管理的本地数据。 所有这些段都是固定大小的,即使是堆栈,它所使用的部分也可以增长或缩小,并在返回函数时被回收。 在应用程序启动时未预先分配且大小固定的唯一段是堆。 应用程序可以在运行时向操作系统请求分配新内存,操作系统将保留部分应用程序虚拟空间并根据需要将其提交到物理内存。 操作系统将返回一个指向新分配的堆内存的指针,该指针保存新块的基址或起始地址。该指针位于堆栈上,当该堆栈空间被回收时,您的指针将不再在范围内,因此您无法访问该内存块。如果你不告诉操作系统你已经完成了它,所以它可以回收它只是坐在那里无法访问的僵尸内存,如果你的应用程序不断请求内存而从不归还它,它会在系统耗尽时崩溃记忆。因此,释放或至少将指针传递到定义它的范围之外的另一个指针很重要,这样您就可以维护到分配在堆空间中的内存的接口。我建议进一步研究虚拟内存并了解段。