使用new/delete
的动态分配据说发生在免费存储上,
而malloc/free
操作使用堆。
我想知道在实践中是否有实际的区别。
编译器对这两个术语有区别吗?(免费存储和堆,而不是new/malloc
)
发布于 2009-08-29 08:15:15
参见http://www.gotw.ca/gotw/009.htm;它可以比我更好地描述堆和自由存储之间的差异:
免费商店:
空闲存储是由
/delete分配/释放的两个动态内存区之一。对象生存期可以小于分配存储的时间;也就是说,空闲存储对象可以在不立即初始化的情况下分配内存,并且可以在不立即释放内存的情况下被销毁。在分配存储但在对象的生命周期之外的期间,可以通过void访问和操作存储,但不能访问原始对象的非静态成员或成员函数,不能获取它们的地址,也不能以其他方式操作。
堆:
堆是另一个动态内存区域,由malloc/free及其变体分配/释放。请注意,虽然默认的全局new和delete可能是由特定编译器实现的malloc和free,但堆与空闲存储不同,在一个区域中分配的内存不能在另一个区域中安全地释放。从堆中分配的内存可以通过放置-新构造和显式销毁-用于类类型的对象。如果这样使用,有关免费存储对象生存期的说明也同样适用于此处。
发布于 2012-02-08 20:18:49
对于C++来说,免费存储和堆之间的区别已经成为纯粹的概念。比如一个用来收集虫子的罐子和一个用来收集饼干的罐子。一种被贴上标签,另一种被贴上标签。这个名称是为了让大家明白,永远不要把"new
“和"delete
”与"malloc
“、"realloc
”或"free
“(或相关的位级别设置)混在一起。
在采访中,可以这样说:"new
和delete
使用免费存储,malloc
和free
使用堆;new
和delete
分别调用构造函数和析构函数,而malloc
和free
不调用。“然而,您经常会听到内存段实际上位于同一区域-然而,这可能是特定于编译器的,也就是说,两者都可以将不同的内存空间指定为池(尽管不确定为什么会这样)。
发布于 2009-08-29 08:19:15
Mike Koval的回答很好地涵盖了这个理论。然而,在实践中,它们几乎总是相同的内存区域--在大多数情况下,如果深入研究编译器的new
实现,您会发现它叫做malloc()
。
换句话说:从机器的角度来看,堆和免费存储是一回事。这种区别存在于编译器内部。
更让人困惑的是,在C++出现之前,我们用“堆”来表示现在所说的“免费存储”。
https://stackoverflow.com/questions/1350819
复制相似问题