什么是内存堆(heap)?
您可能是指从内存分配的角度而非数据结构的角度来看堆(该术语有多重含义)。
一个非常简单的解释是,堆是动态分配内存所在的内存区域(即通过malloc
函数分配的内存)。从堆中分配的内存将保持分配状态,直到发生以下情况之一:
free
释放如果对已分配的内存的所有引用都丢失了(例如,您不再存储指向它的指针),则会出现内存泄漏。这意味着内存仍然被分配,但你没有更容易的方法来访问它。泄漏的内存不能用于未来的内存分配,但当程序结束时,操作系统将释放该内存。
相比之下,栈内存是本地变量所在的位置(即定义在函数内部的变量)。在栈上分配的内存通常只存在于函数返回之前(也有一些例外情况,例如静态局部变量)。
您可以在此文章中了解有关堆的更多信息。
内存堆是内存中的一个位置,可以随机访问和分配内存。与栈不同,堆上分配的单个数据元素通常以异步方式释放,而栈上的内存则按照非常明确定义的顺序分配和释放。当程序显式释放相应指针时,任何这样的数据元素将被释放,并且可能导致堆碎片化。相反,只有位于堆栈顶部(或底部,具体取决于堆栈如何工作)的数据可以被释放,从而导致数据元素按照它们分配的相反顺序被释放。
堆是一个可以按照任意顺序进行内存分配或释放的区域。当使用new
运算符或类似操作创建对象时会发生这种情况。与此相对,栈则是按照先进后出的原则进行内存释放的。
堆是由进程使用的内存管理器从操作系统中分配的一块内存块。调用malloc()
等函数时,会从这个堆中获取内存,而不必直接与操作系统打交道。
堆内存实际上是一个大型的内存池(通常是每个进程),从中运行程序可以请求块。这通常被称为动态分配。
它与堆栈不同,在堆栈上分配“自动变量”。因此,例如,在C函数中定义指针变量时,将在堆栈上分配足够的空间来容纳内存地址。但是,您经常需要在堆上动态分配空间(使用malloc),然后将该内存块开始的地址提供给指针。
内存组织分为两部分:堆内存和栈内存。
堆内存是主要的工作内存,最低地址是起始地址。
在栈内存中,数据流是由下往上驱动的。因此,内存结构被命名为栈。