new/delete
的动态分配据说发生在免费商店上,而malloc/free
操作使用堆 。
在实践中,我想知道是否存在实际差异
编译器是否区分了这两个术语? (免费商店和堆,而不是new/malloc
)
答案 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是一个未分配的堆内存池,提供给程序使用的程序,用于在程序执行期间进行动态分配。 每个程序都提供了一个未分配的堆内存池,可以在执行期间使用它。 该可用内存池称为程序的免费存储。 分配的免费商店内存未命名。