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. 几种Linux 查询外网出口IP的方法

    Curl 纯文本格式输出: curl icanhazip.com curl ifconfig.me curl curlmyip.com curl ip.appspot.com curl ipinfo. ...

  2. Spring@Autowired注解与自动装配

    1   配置文件的方法 我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. Boss ...

  3. tomcat浏览器地址支持中文方法

  4. Mysql 基础 高级查询

    在西面内容中    car  和  nation   都表示 表名 1.无论 高级查询还是简单查询   都用  select.. from..语句   from  后面 加表名  可以使一张表也可以是 ...

  5. 【leetcode】Remove Linked List Elements(easy)

    Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --& ...

  6. 【linux】gcc命令

    来源:http://man.linuxde.net/gcc 语法 gcc(选项)(参数) 选项 -o:指定生成的输出文件: -E:仅执行编译预处理: -S:将C代码转换为汇编代码: -wall:显示警 ...

  7. 解决Odoo出现的Unable to send email, please configure the sender's email address or alias.

    这是由于当前登录用户的邮件地址信息缺失造成的,需要设置其邮件地址. 方法:使用创建该用户的管理员帐号登录系统,开启技术特性,在需要设置邮箱地址的用户界面点击相关的业务伙伴标签链接,如图所示:

  8. ArtDialog文档

    http://www.planeart.cn/demo/artDialog/_doc/API.html#API

  9. 单击双击手势(UITapGestureRecognizer)

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  10. 【Mongodb】3.X 配置身份验证

    配置身份验证详解: 开启认证: 启动MongoDB./mongodb --syslog --fork --port 20000  --auth 1.如果不添加参数:auth,表明用默认的root的权限 ...