天天看点

C++ 自由存储区和堆区

“free store” VS “heap”

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

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

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

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

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

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

你可能就懵了。

事实上,网上看的很多博客,划分自由存储区与堆的分界线就是 与 。然而,尽管C++标准没有要求,但很多编译器的 都是以

那么请问:借以 实现的 ,所申请的内存是在堆上还是在自由存储区上?

从技术上来说,堆(heap)是 语言和操作系统的术语。堆是操作系统所维护的一块特殊内存,它提供了动态分配的功能,当运行程序调用 时就会从中分配,稍后调用 可把内存交还。而自由存储是 ++中通过 和 动态分配和释放对象的抽象概念,通过

结论

  • 自由存储是C++中通过new与delete动态分配和释放对象的抽象概念,而堆(heap)是C语言和操作系统的术语,是操作系统维护的一块动态分配内存。
  • new所申请的内存区域在C++中称为自由存储区。藉由堆实现的自由存储,可以说new所申请的内存区域在堆上。
  • 堆与自由存储区还是有区别的,它们并非等价。

继续阅读