“free store” VS “heap”
当我问你C++的内存布局时,你大概会回答:
“在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区”。
如果我接着问你自由存储区与堆有什么区别,你或许这样回答:
“malloc在堆上分配的内存块,使用free释放内存,而new所申请的内存则是在自由存储区上,使用delete来释放。”
这样听起来似乎也没错,但如果我接着问:
自由存储区与堆是两块不同的内存区域吗?它们有可能相同吗?
你可能就懵了。
事实上,网上看的很多博客,划分自由存储区与堆的分界线就是 与 。然而,尽管C++标准没有要求,但很多编译器的 都是以
那么请问:借以 实现的 ,所申请的内存是在堆上还是在自由存储区上?
从技术上来说,堆(heap)是 语言和操作系统的术语。堆是操作系统所维护的一块特殊内存,它提供了动态分配的功能,当运行程序调用 时就会从中分配,稍后调用 可把内存交还。而自由存储是 ++中通过 和 动态分配和释放对象的抽象概念,通过
结论
- 自由存储是C++中通过new与delete动态分配和释放对象的抽象概念,而堆(heap)是C语言和操作系统的术语,是操作系统维护的一块动态分配内存。
- new所申请的内存区域在C++中称为自由存储区。藉由堆实现的自由存储,可以说new所申请的内存区域在堆上。
- 堆与自由存储区还是有区别的,它们并非等价。