2024-12-11 08:00:04

什么是内存堆?

什么是内存堆?


当前回答

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

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

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

其他回答

堆只是一个没有任何顺序地分配或释放内存的区域。这种情况发生在使用new操作符或类似操作符创建对象时。这与按先入后出原则释放内存的堆栈相反。

想必您是指从内存分配的角度来看堆,而不是从数据结构的角度来看堆(这个术语有多种含义)。

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

内存已释放 程序终止

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

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

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

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

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

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

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

内存组织分为两部分:堆内存和堆栈内存。

堆内存是主工作内存,最低地址是起始地址。

在堆栈内存中,数据流是由自下而上的方法驱动的。然后内存Arch被命名为stack。