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。

free store VS heap(自由存储区VS堆)的更多相关文章

  1. C++中内存布局 以及自由存储区和堆的理解

    文章搬运自https://www.cnblogs.com/QG-whz/p/5060894.html,如有侵权请告知删除 当我问你C++的内存布局时,你大概会回答: "在C++中,内存区分为 ...

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

    "free store" VS "heap" 当我问你C++的内存布局时,你大概会回答: "在C++中,内存区分为5个区,分别是堆.栈.自由存储区.全 ...

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

      “free store” VS “heap” 当我问你C++的内存布局时,你大概会回答: “在C++中,内存区分为5个区,分别是堆.栈.自由存储区.全局/静态存储区.常量存储区”. 如果我接着问你 ...

  4. linux面试之--堆、栈、自由存储区、全局/静态存储区和常量存储区

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

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

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

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

    内存区划分.内存分配.常量存储区.堆.栈.自由存储区.全局区[C++][内存管理][转载] 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放 ...

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

    日志                                                                                                  ...

  8. 【校招面试 之 C/C++】第14题 C++ 内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区(堆栈的区别)

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

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

    http://www.cnblogs.com/JCSU/articles/1051579.html 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序 ...

随机推荐

  1. 【leetcode】Convert Sorted List to Binary Search Tree (middle)

    Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...

  2. 【leetcode】Spiral Matrix II (middle)

    Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...

  3. PDO(数据访问抽象层)

    自带事务功能,多条sql同时执行时,如果其中一条执行失败,那么所有的都执行失败.开启了事务,可以进行回滚操作,让程序变得更安全. 1.访问不同的数据库2.自带事务功能3.防止SQL注入:分两次发送 / ...

  4. osg 纹理访问器

    #include<osgViewer/Viewer> #include<osg/Node>#include<osg/Geode>#include<osg/Gr ...

  5. Myeclipse编写struts程序

    说到struts则必须要谈到MVC模式(Model2) 什么是MVC模式.随着应用系统的逐渐增大,系统的业务逻辑复杂度以几何级数方式增加,在这样的情况下,如果还是把所有的处理逻辑都放在JSP页面中,那 ...

  6. Maven管理

    来自: http://www.cnblogs.com/bigtall/archive/2011/03/23/1993253.html.

  7. 关于logcat日志

    最近学习android,碰到了logcat,个人总结一下. 当不出日志是解决办法: ProjectMenu---后台设置----LOG设置---LOG开关 Logcat(deprecated)和Log ...

  8. 数据结构和算法 c#– 1.单项链表

    1.顺序存储结构 Array 1.引用类型(托管堆) 2.初始化时会设置默认值   2.链式存储结构 2.1.单向链表 2.2.循环链表 2.3.双向链表

  9. 设计模式学习之策略模式(Strategy,行为型模式)(13)

    转载地址:http://www.cnblogs.com/zhili/p/StragetyPattern.html 一.引言 本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方 ...

  10. HTML5学习之拖放(十)

    l元素可以用于拖拽必须设置draggable="true"属性,img和a标签除外,她们两个默认就可以被拖拽 想做拖拽处理,就需要在Dom元素上监听拖放的事件:dragstart, ...