什么是内存堆?
什么是内存堆?
大概你是指从内存分配的angular度来看,而不是从数据结构的angular度来看(这个术语有多种含义)。
一个非常简单的解释是, 堆是dynamic分配的内存所在的内存部分(即通过malloc
分配的malloc
)。 从堆分配的内存将保持分配状态,直到出现以下情况之一:
- 内存是
free
的 - 程序终止
如果所有对分配内存的引用都丢失了(例如,你不再存储一个指针),那么你就有所谓的内存泄漏 。 这是内存仍然被分配的地方,但是你再也没有简单的方法来访问它了。 泄漏的内存不能回收用于将来的内存分配,但是当程序结束时内存将被操作系统释放。
将它与堆栈内存进行对比,这是本地variables(方法中定义的那些variables)存在的地方。 在栈上分配的内存通常只有在函数返回时才会存在(有一些例外情况,例如静态局部variables)。
您可以在本文中find有关堆的更多信息。
内存堆是内存中可以按随机访问分配内存的位置。
与以非常明确的顺序分配和释放内存的堆栈不同,分配在堆上的单个数据元素通常是以彼此asynchronous的方式释放的。 当程序明确释放相应的指针时,任何这样的数据元素都将被释放,这可能会导致碎片堆。 相反,只有顶部(或底部,取决于堆栈工作方式)的数据可能被释放,导致数据元素以相反的顺序被释放。
这是由进程使用的内存pipe理器从操作系统分配的一大块内存。 调用malloc()
等等,然后从这个堆中获取内存,而不必直接处理操作系统。
你可能是指堆内存,而不是内存堆。
堆内存本质上是一个庞大的内存池(通常是每个进程),正在运行的程序可以从中请求块。 这通常称为dynamic分配 。
它与分配“自动variables”的堆栈不同。 因此,例如,当您在C函数中定义一个指针variables时,在堆栈上分配足够的空间来存放内存地址。 但是,您经常需要在堆上dynamic分配空间(使用malloc),然后将该内存块开始的地址提供给指针。
内存堆是保存dynamic分配内存的常见结构。 请参阅wikipedia上的Dynamic_memory_allocation 。
还有其他的结构,如水池,堆栈和桩。
堆只是内存分配或释放没有任何顺序的区域。 当使用new
操作符或类似的东西创build一个对象时会发生这种情况。 这与内存在先进先出的基础上被释放的堆栈相反。