Nic*_*kis 112 c++ memory-management
new/delete
据说动态分配在免费商店中进行,
而malloc/free
操作则使用堆.
在实践中,我想知道是否存在实际差异.
编译器是否区分了这两个术语?(免费商店和堆,不new/malloc
)
Mic*_*val 69
见http://www.gotw.ca/gotw/009.htm ; 它可以比我更好地描述堆和免费商店之间的差异:
免费店:
免费存储是两个动态内存区域之一,由new/delete分配/释放.对象生存期可以小于分配存储的时间; 也就是说,免费存储对象可以在不立即初始化的情况下分配内存,并且可以在不立即释放内存的情况下销毁它们.在分配存储但在对象的生命周期之外的期间,可以通过void*访问和操作存储,但是可以访问原始对象的非静态成员或成员函数,获取其地址,或者以其他方式操纵.
堆:
堆是另一个动态内存区域,由malloc/free及其变体分配/释放.请注意,虽然默认的全局new和delete可能由malloc实现并且由特定编译器释放,但堆与free store不同,并且在一个区域中分配的内存无法在另一个区域中安全地释放.从堆分配的内存可以通过放置 - 新构造和显式销毁用于类类型的对象.如果这样使用,关于免费商店对象生存期的注释在此类似地适用.
Kit*_*t10 59
对于C++,免费存储和堆之间的区别已经变得纯粹是概念性的.就像一个用于收集bug的jar和一个用于收集cookie的jar.一个标记为单向,另一个标记为另一个.这个名称的目的是为了让你不要将"new"和"delete"与"malloc","realloc"或"free"(或者就此而言的位级别设置)混合起来.
在访谈期间,最好说"new和delete使用免费商店,malloc并免费使用堆; new和delete分别调用构造函数和析构函数,但malloc和free不会." 然而,您经常会听到内存段实际上位于同一区域 - 但是,这可能是编译器特定的,也就是说,两者都可以将不同的内存空间指定为池(不确定为什么会这样,虽然).
Cra*_*rks 24
Mike Koval的回答很好地涵盖了这个理论.然而,在实践中,它们几乎总是在相同的内存区域 - 在大多数情况下,如果你深入研究编译器的实现new
,你会发现它的调用malloc()
.
换句话说:从机器的角度来看,堆和免费存储是一回事.区别在于编译器内部.
为了让事情更加混乱,在C++出现之前,我们说"堆"意味着现在所谓的"免费商店".
归档时间: |
|
查看次数: |
48545 次 |
最近记录: |