首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++、免费存储vs堆

C++、免费存储vs堆
EN

Stack Overflow用户
提问于 2009-08-29 08:05:42
回答 7查看 62.2K关注 0票数 141

使用new/delete的动态分配据说发生在免费存储上,

malloc/free操作使用

我想知道在实践中是否有实际的区别。

编译器对这两个术语有区别吗?(免费存储和堆,而不是new/malloc)

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-08-29 08:15:15

参见http://www.gotw.ca/gotw/009.htm;它可以比我更好地描述堆和自由存储之间的差异:

免费商店:

空闲存储是由

/delete分配/释放的两个动态内存区之一。对象生存期可以小于分配存储的时间;也就是说,空闲存储对象可以在不立即初始化的情况下分配内存,并且可以在不立即释放内存的情况下被销毁。在分配存储但在对象的生命周期之外的期间,可以通过void访问和操作存储,但不能访问原始对象的非静态成员或成员函数,不能获取它们的地址,也不能以其他方式操作。

堆:

堆是另一个动态内存区域,由malloc/free及其变体分配/释放。请注意,虽然默认的全局new和delete可能是由特定编译器实现的malloc和free,但堆与空闲存储不同,在一个区域中分配的内存不能在另一个区域中安全地释放。从堆中分配的内存可以通过放置-新构造和显式销毁-用于类类型的对象。如果这样使用,有关免费存储对象生存期的说明也同样适用于此处。

票数 84
EN

Stack Overflow用户

发布于 2012-02-08 20:18:49

对于C++来说,免费存储和堆之间的区别已经成为纯粹的概念。比如一个用来收集虫子的罐子和一个用来收集饼干的罐子。一种被贴上标签,另一种被贴上标签。这个名称是为了让大家明白,永远不要把"new“和"delete”与"malloc“、"realloc”或"free“(或相关的位级别设置)混在一起。

在采访中,可以这样说:"newdelete使用免费存储,mallocfree使用堆;newdelete分别调用构造函数和析构函数,而mallocfree不调用。“然而,您经常会听到内存段实际上位于同一区域-然而,这可能是特定于编译器的,也就是说,两者都可以将不同的内存空间指定为池(尽管不确定为什么会这样)。

票数 80
EN

Stack Overflow用户

发布于 2009-08-29 08:19:15

Mike Koval的回答很好地涵盖了这个理论。然而,在实践中,它们几乎总是相同的内存区域--在大多数情况下,如果深入研究编译器的new实现,您会发现它叫做malloc()

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

更让人困惑的是,在C++出现之前,我们用“堆”来表示现在所说的“免费存储”。

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1350819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档