C ++,免费存储与堆


Answers:


76

参见http://www.gotw.ca/gotw/009.htm;它可以比我更好地描述堆和免费存储之间的差异:

免费商店:

空闲存储区是两个动态内存区域之一,由new / delete分配/释放。对象生存期可以小于分配存储的时间;也就是说,免费存储对象可以在不立即初始化的情况下分配内存,并且可以在不立即释放内存的情况下将其销毁。在分配存储空间但在对象生命周期之外的时间段内,可以通过void *访问和操作存储空间,但不能访问原型对象的非静态成员或成员函数,也不能获取其地址,也不能进行其他操作。

堆:

堆是另一个动态内存区域,由malloc / free及其变体分配/释放。请注意,虽然默认的全局new和delete可能是通过malloc和free由特定的编译器实现的,但堆与free store不同,并且在一个区域中分配的内存不能安全地在另一区域中释放。从堆分配的内存可通过重新放置构造和显式销毁而用于类类型的对象。如果这样使用,则有关免费存储对象生存期的注释在这里也类似适用。


23
我不同意。在动态分配的上下文中,“堆”一词既未由C ++标准使用,也未由C99使用(我没有C ++所指的C89,如果使用此词,可随时对其进行纠正)。我找不到相关GotW的发布日期,但是由于它讨论的是草案,因此显然是预先标准的。
2009年

2
恕我直言,这是所有术语的问题。说先生 Stroustrup不能区分“堆”和“免费存储”: stroustrup.com/Programming/17_free_store.ppt,幻灯片12。“堆”在C ++之前很早就被用作动态内存的同义词,因为Lisp时代(1960年代)曾使用过堆数据结构用于内存分配。
Alexey Voytenko '16

我通常认为堆(通过maloc / free)是一种“原始”材料供应商。您需要一块内存,却没有多余的装饰。您必须自己构建任何结构。免费商店(新货/删除货)更像是“成品”供应商。您需要一个对象,并为其分配了一些空间,并建立了该对象并准备好使用。完成后将其清理干净。
Anshuman Kumar

67

对于C ++,免费存储和堆之间的区别已成为纯粹的概念。就像一个用来收集bug的罐子和一个用来收集cookie的罐子。一种被标记为一种方式,另一种被标记为。此名称的意思是您切勿将“ new”和“ delete”与“ malloc”,“ realloc”或“ free”(或与此相关的位级别集)混合使用。

在访谈中这是很好的说,“ newdelete使用自由存储区,mallocfree使用堆; new以及delete但是调用分别构造函数和析构函数,mallocfree没有。” 但是,您经常会听到内存段确实在同一区域中-但是,这可能是特定于编译器的,也就是说,可能两者都可以将不同的内存空间指定为池(不知道为什么会这样,虽然)。


28

Mike Koval的答案很好地涵盖了这一理论。但是,实际上,它们几乎总是相同的内存区域-在大多数情况下,如果深入研究编译器的实现new,就会发现它称为malloc()

换句话说:从机器的角度来看,堆和免费存储是同一回事。区别存在于编译器内部。

为了使事情更加混乱,在C ++出现之前,我们说过“堆”是指现在所谓的“免费存储”。


5

术语“堆”也可以指特定的数据结构,但是在C ++ malloc,空闲,新建和删除操作的上下文中,术语“堆”和“空闲存储”或多或少地可互换使用。


3

堆和免费存储不应互操作。在受约束的环境中,例如在具有c ++ 11标准库的AVR 8位微控制器中,它们甚至不能在同一程序中使用。空闲存储和堆在相同的内存空间中进行分配,彼此覆盖结构和数据。在这种情况下,免费存储与Heap不同,并且不兼容,因为“新/删除免费存储库”比“ Malloc / free / realloc / calloc堆库”更简单(并且更快),因此为C ++嵌入式编程器(在您只有512字节RAM的情况下)。

请参阅https://github.com/ambroise-leclerc/ETL/tree/master/libstd的 8位c ++ 11/14标准库


2

除了诸如push_heapet al之类的堆函数的描述外,我不记得曾经提到堆这个标准。所有动态分配均在免费商店中执行。


1

空闲存储是分配给程序的未分配堆内存池,程序在执行程序时将其用于动态分配。每个程序都具有一个未分配的堆内存池,该池可在执行期间使用。此可用内存池称为程序的免费存储。分配的空闲存储内存未命名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.