C ++,Free-Store vs Heap

时间:2009-08-29 08:05:42

标签: c++ memory-management

new/delete的动态分配据说发生在免费商店上,而malloc/free操作使用

在实践中,我想知道是否存在实际差异 编译器是否区分了这两个术语? (免费商店,而不是new/malloc

7 个答案:

答案 0 :(得分:68)

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

<强>免店内:

  

免费商店是两者之一   动态内存区域,已分配/已释放   通过new / delete。对象的生命周期可以   少于存储时间   分配;也就是说,免费存储对象   没有分配内存   立即初始化,并且可以   在没有记忆的情况下被摧毁   立即解除分配。在此期间   分配存储的时间段   但是在对象的一生之外,   可以访问存储和   通过空洞操纵*但没有   原始物体的非静止物质   成员或成员职能可能是   访问,获取他们的地址,   或被操纵。

<强>堆

  

堆是另一个动态内存   区域,由malloc / free分配/释放   和他们的变种。请注意,虽然   默认全局new和delete   可能是以实施的方式实施的   malloc和特定的免费   编译器,堆不一样   免费存储和内存分配在一个   区域不能安全地解除分配   另一个。内存分配来自   heap可以用于类的对象   按安置类型 - 新建筑和   明确的破坏。如果这样使用,   关于免费商店对象生存期的说明   在这里同样适用。

答案 1 :(得分:52)

对于C ++,免费存储和堆之间的区别已经变得纯粹是概念性的。就像一个用于收集bug的jar和一个用于收集cookie的jar。一个标记为单向,另一个标记为另一个。这个名称的目的是为了让你不要将“new”和“delete”与“malloc”,“realloc”或“free”(或者就此而言的位级别设置)混合起来。

在访谈期间,可以说“new和delete使用免费商店,malloc并免费使用堆; new和delete分别调用构造函数和析构函数,但malloc和free不会。”然而,您经常会听到内存段实际上位于同一区域 - 但是,这可能是编译器特定的,也就是说,两者都可以将不同的内存空间指定为池(不确定为什么会这样,虽然)。

答案 2 :(得分:22)

迈克科瓦尔的回答非常清楚地涵盖了理论。然而,在实践中,它们几乎总是相同的内存区域 - 在大多数情况下,如果你深入研究编译器的new实现,你会发现它调用malloc()

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

为了让事情更加混乱,在C ++出现之前,我们说“堆”意味着现在所谓的“免费商店”。

答案 3 :(得分:2)

术语“堆”也可以指特定的数据结构,但是在C ++ malloc,free,new和delete操作的上下文中,术语“堆”和“免费存储”或多或少地可互换使用。

答案 4 :(得分:2)

堆和免费存储不应该是可互操作的。 在具有c ++ 11标准库的AVR 8位微控制器等受限制的上下文中,它们甚至不能在同一程序中使用。免费存储和堆在相同的内存空间中进行分配,覆盖彼此的结构和数据。 在这种情况下,Free store与Heap不同并且与Heap不兼容,因为“new / delete free store library”比“malloc / free / realloc / calloc堆库”更简单(更快),从而为内存提供了巨大的内存使用量。 C ++嵌入式程序员(在只有512字节RAM的环境中)。

请参阅https://github.com/ambroise-leclerc/ETL/tree/master/libstd

上的8位c ++ 11/14标准库

答案 5 :(得分:1)

我不记得标准曾经提到过堆这个词,除了像push_heap等人的堆函数的描述。所有动态分配都在免费商店中执行。

答案 6 :(得分:0)

Free Store是一个未分配的堆内存池,提供给程序使用的程序,用于在程序执行期间进行动态分配。 每个程序都提供了一个未分配的堆内存池,可以在执行期间使用它。 该可用内存池称为程序的免费存储。 分配的免费商店内存未命名。