new/delete
据说动态分配是在免费存储上进行的,
而malloc/free
操作则使用堆。
在实践中,我想知道是否存在实际差异。
编译器是否区分这两个术语?(免费存储和堆,不是new/malloc
)
new/delete
据说动态分配是在免费存储上进行的,
而malloc/free
操作则使用堆。
在实践中,我想知道是否存在实际差异。
编译器是否区分这两个术语?(免费存储和堆,不是new/malloc
)
Answers:
参见http://www.gotw.ca/gotw/009.htm;它可以比我更好地描述堆和免费存储之间的差异:
免费商店:
空闲存储区是两个动态内存区域之一,由new / delete分配/释放。对象生存期可以小于分配存储的时间;也就是说,免费存储对象可以在不立即初始化的情况下分配内存,并且可以在不立即释放内存的情况下将其销毁。在分配存储空间但在对象生命周期之外的时间段内,可以通过void *访问和操作存储空间,但不能访问原型对象的非静态成员或成员函数,也不能获取其地址,也不能进行其他操作。
堆:
堆是另一个动态内存区域,由malloc / free及其变体分配/释放。请注意,虽然默认的全局new和delete可能是通过malloc和free由特定的编译器实现的,但堆与free store不同,并且在一个区域中分配的内存不能安全地在另一区域中释放。从堆分配的内存可通过重新放置构造和显式销毁而用于类类型的对象。如果这样使用,则有关免费存储对象生存期的注释在这里也类似适用。
对于C ++,免费存储和堆之间的区别已成为纯粹的概念。就像一个用来收集bug的罐子和一个用来收集cookie的罐子。一种被标记为一种方式,另一种被标记为。此名称的意思是您切勿将“ new
”和“ delete
”与“ malloc
”,“ realloc
”或“ free
”(或与此相关的位级别集)混合使用。
在访谈中这是很好的说,“ new
和delete
使用自由存储区,malloc
并free
使用堆; new
以及delete
但是调用分别构造函数和析构函数,malloc
并free
没有。” 但是,您经常会听到内存段确实在同一区域中-但是,这可能是特定于编译器的,也就是说,可能两者都可以将不同的内存空间指定为池(不知道为什么会这样,虽然)。
堆和免费存储不应互操作。在受约束的环境中,例如在具有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标准库