1. free store VS heap

free store (自由存储区)和 heap (堆),在C/C++中经常会遇到。他们是否有区别呢?

偶最早发现这两个概念性问题是在《Exceptional C++》一书中。

其中提到C++中使用new分配所得的内存是分配在 freestore 上,而C 风格的内存分配 malloc 分配所得的内存是在 heap 上。

额。这个有什么区别呢?

通过在 Google 的搜索,所得的中文资料相当少,英文的倒是不少,而且不少还有争议性质。

不过部分观点是已经达成共识的。

这里,作为翻译,略微加上一点自己的思想,写在这里——

首先呢,有必要知道malloc内存分配和new内存分配上的区别。

前者,是C 语言中很典型的分配方法,它的作用就是根据参数指定大小,分配一定的动态内存空间。

操作系统会处理这件事情,它会遍历系统维护的空闲内存链表来找到大小与之最匹配的内存区域。

(当然也有其他分配算法)

获得了这部分内存,返回给程序员的是一个  void* 类型的指针(其实是无类型)。

释放使用free,其实就是告诉操作系统,这一部分的内存区域不再使用,你可以回收了。

那么,操作系统就会乖乖地把这个内存区的首地址再加入到自身维护的空闲内存链表中。

如果忘记free,后果就是恐怖的“内存泄露”(memory leakage)。

然后,我们再看new。C++中new已经是一个“运算符”了,我们可以重载operator new 和 placement new。

它也是分配内存,同时在这块内存上执行所要new 的对象的构造函数以建立起这个对象。

(说“对象”,略微有点不严格,不过没关系,这个区别已经淡化了,

built-in type ,也就是内置类型,他们也可以被new,执行是这些基本类型的伪构造函数)

对应free,这里有delete。它不仅是free了这块内存,而且执行了对应对象的析构函数。

……

某文献上有这么几句:

Note that the heap and free-store may reside on distinct physical memory regions and they might be controlled by different underlying memory managers.

Technically, free-store is an abstract term referring to unused memory that is available for dynamic allocations. Heap is the data model used by virtually all C++ compilers to implement the free-store. In practice, however, the distinction between heap and free-store is roughly equivalent to the differences between the memory models of C and C++.

个人翻译:

注意的是,堆(heap)和自由存储区(freestore)可能是位于不同的物理内存区域,并且它们可能被不同的底层内存管理器控制。

从技术角度来说,freestore 是一个抽象的术语,它表示那些用来动态分配内存的未占用空间。

而 heap 是一个具体形象的数据模型概念,它通过C++编译器去实现扩充了freestore。

事实上,两者的区别有点像是 C 和 C++ 的内存模型的差异。

因为毕竟C++中用malloc,calloc,realloc 和 free 并不多,除非一些特定情况,我们需要获取一部分原始内存(raw memory)。

概念的问题,争论的太深入也没太大必要。有时候毕竟没必要区别他们那么清。

某外文网站上的说明是:http://www.gotw.ca/gotw/009.htm

Free-store:

The free store is one of the two dynamic memory areas, allocated/freed by new/delete. Object lifetime can be less than the time the storage is allocated; that is, free store objects can have memory allocated without being immediately initialized, and can be destroyed without the memory being immediately deallocated. During the period when the storage is allocated but outside the object's lifetime, the storage may be accessed and manipulated through a void* but none of the proto-object's nonstatic members or member functions may be accessed, have their addresses taken, or be otherwise manipulated.

Heap:

The heap is the other dynamic memory area, allocated/freed by malloc/free and their variants. Note that while the default global new and delete might be implemented in terms of malloc and free by a particular compiler, the heap is not the same as free store and memory allocated in one area cannot be safely deallocated in the other. Memory allocated from the heap can be used for objects of class type by placement-new construction and explicit destruction. If so used, the notes about free store object lifetime apply similarly here.

总结:已经可以确定的结论是,自由存储区是由new/delete来管理的,而堆是由malloc/free来管理的;关于heap和free store的具体详细区别,到目前为止并没有一个特别准确的结论。

2. 关于内存管理

参见http://www.cnblogs.com/JCSU/articles/1051579.html,但是该文中对heap和free store 的区别界定反了,应该是new/delete 对应于free store。

转载于:https://www.cnblogs.com/jiayouwyhit/p/3242124.html

free store VS heap(自由存储区VS堆)相关推荐

  1. c语言自由存储区,C/C++ 内存分区以及自由存储区和堆的区别

    作者: 骇客HK 出处:https://www.cnblogs.com/ruanraun/p/Heap.html C/C++编译的程序占用的内存分区 1.栈区(stack)- 由编译器自动分配释放 , ...

  2. 自由存储区和堆的区别_区块链发展阶段:IPFS和Filecoin赋能分布式存储

    2008 年,中本聪发布了一篇<比特币:一种点对点的电子现金系统>的论文,该文章详细阐述了基于点对点网络.加密.时间戳.共识机制等多种技术集成构建电子现金系统的实现理念,并由此打开了区块链 ...

  3. C++ 自由存储区是否等价于堆?

    文章也发布在 听风过境的专栏 "free store" VS "heap" 当我问你C++的内存布局时,你大概会回答: "在C++中,内存区分为5个区 ...

  4. C/C++内存分配、内存区划分、常量存储区、堆、栈、自由存储区、全局区(静态区)、代码区

    C/C++内存分配.内存区划分.常量存储区.堆.栈.自由存储区.全局区 C++中,内存分成几个区: 栈(stack) 堆(heap) 自由存储区 全局/静态存储区 常量存储区 代码区 对于C++的内存 ...

  5. 堆、栈、自由存储区、全局/静态存储区、常量存储区比较

    1.C语言中分为下面几个存储区 栈(stack): 由编译器自动分配释放 堆(heap): 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 全局区(静态区): 全局变量和静态变量的存储 ...

  6. C++ 堆、栈、自由存储区、全局静态存储区和常量存储区

    文章来自一个论坛里的回帖,哪个论坛记不得了!    在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.     栈,就是那些由编译器在需要的时候分配,在不需要的时 ...

  7. C++内存分配方式-堆、栈、自由存储区、全局/静态存储区和常量存储区

    一个由C/C++编译的程序占用的内存分为以下几个部分: 1.栈区(stack)-  由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.    2.堆区(heap) ...

  8. C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用. 和堆一 ...

  9. 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理]...

    这可以帮助你深入了解程序的运行机制,由于自己还是一个初学者,因此大部分内容都只是转载. http://blog.sina.com.cn/s/blog_7edcf63b0100yhk9.html 一. ...

最新文章

  1. java结丹期(13)----javaweb(responserequestservletcontext)
  2. 使用VisualTreeHelper.GetDrawing(Visual v)枚举所有Visual内容的对象
  3. 如何优雅的在java中统计代码块耗时
  4. bilibili视频解析php源码,Bilibili视频直链信息解析工具源码
  5. 2021年机修钳工(初级)考试资料及机修钳工(初级)证考试
  6. 快速取消PPT中所有动画效果
  7. windows7 优化:readyboost总结
  8. 《服务外包概论》知识点梳理
  9. 大宗商品交易平台支持多种交易模式,你了解多少?
  10. Canvas实例之鼠标移动特效(彩色小球)
  11. 打开视频文件提示服务器异常,视频解析服务器异常
  12. 计算机软件资产代码,IT资产命名规则-2015
  13. Jamie's Contact Groups ——(一对多)二分图多重最大匹配
  14. Uncaught Error: USERKEY_PLAT_NOMATCH 的原因和解决办法
  15. J2EE程序框架学习总结
  16. 随记 | 我的 CSDN 两周年创作纪念日
  17. 主R 主A 什么意思
  18. 360环视辅助驾驶硬件系统方案---OV2715+DS90UB913+DS90UB914+FPGA
  19. 小米2S手机,手机连接数据线到电脑上没反应(Win7/8)
  20. 使用QSocket实现的文件传输软件(聊天)

热门文章

  1. 企业主要培养三大方向的思考习惯
  2. 反射真的存在性能问题吗?
  3. 专为人工智能和数据科学而生的Go语言,或将取代Python
  4. 以太坊的4个发展阶段与难度炸弹
  5. python入门——P46魔法方法:描述符(Property的原理)
  6. STL应用--SORT自定义排序
  7. pvid和vid区别,tag口和untag口区别
  8. linux统计所有进程总共占用多少内存?
  9. 利用iptabls的NFLOG记录自己的HTTP HTTPS上网行为
  10. 并行循环和嵌套循环_并行嵌套循环连接–嵌套循环连接和残留谓词的内侧