C++ 自由存储区和堆区

“free store” VS “heap”

当我问你C++的内存布局时,你大概会回答:

“在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区”。

如果我接着问你自由存储区与堆有什么区别,你或许这样回答:

“malloc在堆上分配的内存块,使用free释放内存,而new所申请的内存则是在自由存储区上,使用delete来释放。”

这样听起来似乎也没错,但如果我接着问:

自由存储区与堆是两块不同的内存区域吗?它们有可能相同吗?

你可能就懵了。

事实上,网上看的很多博客,划分自由存储区与堆的分界线就是 n e w / d e l e t e new/delete new/delete m a l l o c / f r e e malloc/free malloc/free 。然而,尽管C++标准没有要求,但很多编译器的 n e w / d e l e t e new/delete new/delete 都是以 m a l l o c / f r e e malloc/free malloc/free 为基础来实现的。

那么请问:借以 m a l l o c malloc malloc 实现的 n e w new new ,所申请的内存是在上还是在自由存储区上?

从技术上来说,堆(heap) C C C语言和操作系统的术语。堆是操作系统所维护的一块特殊内存,它提供了动态分配的功能,当运行程序调用 m a l l o c ( ) malloc() malloc() 时就会从中分配,稍后调用 f r e e free free 可把内存交还。而自由存储 C C C++中通过 n e w new new d e l e t e delete delete 动态分配和释放对象的抽象概念,通过 n e w new new 来申请的内存区域可称为自由存储区。

基本上,所有的C++编译器默认使用堆来实现自由存储,也即是缺省的全局运算符 n e w new new d e l e t e delete delete 也许会按照 m a l l o c malloc malloc f r e e free free 的方式来被实现,这时即由 n e w new new 运算符分配的对象,说它在堆上也对,说它在自由存储区上也正确。但可以通过重载操作符,改用其他内存来实现自由存储,例如全局变量做的对象池,这时自由存储区就区别于堆了。 我们所需要记住的就是:

堆是操作系统维护的一块内存,而自由存储是C++中通过new与delete动态分配和释放对象的抽象概念。堆与自由存储区并不等价。


结论

  • 自由存储是C++中通过new与delete动态分配和释放对象的抽象概念,而堆(heap)是C语言和操作系统的术语,是操作系统维护的一块动态分配内存。

  • new所申请的内存区域在C++中称为自由存储区。藉由堆实现的自由存储,可以说new所申请的内存区域在堆上。

  • 堆与自由存储区还是有区别的,它们并非等价。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值