作者: 骇客HK

出处:https://www.cnblogs.com/ruanraun/p/Heap.html

C/C++编译的程序占用的内存分区

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数名,局部变量的名等。其操作方式类似于数据结构中的栈。

2、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、全局/静态存储区 —全局变量和局部静态变量的存储是放在一块的(在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分)。程序结束后由系统释放。

4、常量存储区 — 常量字符串就是放在这里的,正常情况不允许修改,程序结束后由系统释放 。

5、程序代码区 — 存放函数体的二进制代码。

自由存储区(free store) 和 堆区 (heap) ?

我参考了网上很多资料和文章关于C/C++的内存分区都把自由存储区和堆区单独区分了开来,很多C/C++内存分区分类都是如下分类:

1、栈区 —  (同上)

2、堆区 —  由malloc等分配的内存块,它是用free来结束自己的生命的。

3、自由存储区 — 由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。

4、全局/静态存储区 —  (同上)

5、常量存储区 —   (同上)

我对第二种分类方式产生了如下疑问:自由存储区与堆区的内存区域有可能相同吗?

很多文章一般用来划分自由存储区与堆的分界线就是new/delete与malloc/free。而C语言很明确地知道malloc/free是在堆上进行内存操作。那么new/delete申请销毁的区域是否也在堆上呢?

我随后通过查阅相关的资料和文章,最终还是找到了答案:

里面写到

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.

Free Store

自由存储是两个动态内存区域之一,由NeX/Delphi分配/释放。对象生存期可以小于存储分配的时间;也就是说,空闲存储对象可以在不立即初始化的情况下分配内存,并且可以在没有立即释放内存的情况下被销毁。在存储被分配但在对象的生命周期之外的期间,可以通过void*访问和操作存储,但是可以访问原始对象的非静态成员或成员函数中的任何一个,不具有它们的地址,或者以其他方式操作。

Heap

堆是另一个动态内存区域,由MALOC/FILE和它们的变体分配/释放。请注意,虽然默认全局全局和删除可以用Malc和特定编译器自由实现,但堆与自由存储区不相同,并且在一个区域中分配的内存不能在另一个区域安全地释放。从堆中分配的内存可以通过放置新构造和显式销毁来使用类类型的对象。如果使用的话,关于自由存储对象寿命的注释在这里同样适用。

所以关于自由存储区与堆区得到以下结论:

堆是操作系统维护的一块内存,而自由存储是C++中通过new与delete动态分配和释放对象的抽象概念。堆与自由存储区并不等价。

但至于前面说‘new/delete所申请销毁的区域也在堆上’这句话也不能算错。

总结:

关于C/C++的内存分区前面两种分类方式都不能算错,造成分类的差异只是因为C语言和C++语言发展和语言背景的差异罢了,而现在大多数人都喜欢用‘C/C++’来统称这两门语言,而所谓的‘C/C++’其实更多指的是C++(C++在语言的设计上,将C作为子集,基本保留了C语言的语法和特性)所以才产生了种种分内的差异。

参考文章

https://www.cnblogs.com/QG-whz/p/5060894.html

http://www.gotw.ca/gotw/009.htm

c语言自由存储区,C/C++ 内存分区以及自由存储区和堆的区别相关推荐

  1. 16 bit float 存储_小数在内存中是如何存储的,揭秘诺贝尔奖级别的设计(长篇神文)...

    小数在内存中是以浮点数的形式存储的.浮点数并不是一种数值分类,它和整数.小数.实数等不是一个层面的概念.浮点数是数字(或者说数值)在内存中的一种存储格式,它和定点数是相对的.C语言使用定点数格式来存储 ...

  2. 【C 语言必知必会】内存管理、动态分配内存、野指针

    C 语言内存管理.动态分配内存.野指针 文章目录 C 语言内存管理.动态分配内存.野指针 前言: 1.内存分区 1.1 代码区 1.2.1 全局初始化数据区(静态数据区data段) 1.2.2 未初始 ...

  3. C语言 | 变量、函数及内存分区

    目录 全局变量(存储在数据区) 静态变量(存储在数据区) 全局变量.局部变量.静态全局变量.静态局部变量对比 二.函数 静态函数 三.内存分区 四.内存相关函数 malloc()  [#include ...

  4. 区分-JVM内存分区和Java内存模型(Java Memory Model)

    也是最近被问到了Java内存模型,学识浅薄,一直以为内存分区和内存模型是一个东西,现在做一下笔记整理一下以区分和学习这两个概念及其延伸的一些知识点. 开门见山 解决问题 JVM内存分区具体指的是JVM ...

  5. 【C 语言】变量本质 ( 变量概念 | 变量本质 - 内存空间别名 | 变量存储位置 - 代码区 | 变量三要素 )

    文章目录 一.变量概念 二.变量本质 1.变量本质 - 内存别名 2.变量存储位置 - 代码区 3.变量三要素 一.变量概念 变量概念 : 变量 是 既能读 , 又能写 的 内存对象 ; 与 变量 相 ...

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

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

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

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

  8. C++内存管理__内存管理(栈、堆(new/delete)、自由存储区(malloc/freee)、全局/静态存储区、常量区)!堆栈内存管理方式的区别

    内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄 ...

  9. alin的学习之路:C语言篇(一)(内存四区模型,宏函数,调用惯例,内存存储方式)

    @TOC(内存四区模型,宏函数,调用惯例,内存存储方式) 1. 内存四区及其使用注意 内存四区:代码区,全局静态区,栈区,堆区 代码区 代码区存放的是CPU执行的二进制指令 特点: 只读 共享 栈区 ...

最新文章

  1. docker linux界面版,centos 7 Docker使用Portainer搭建可视化界面
  2. 幼儿园计算机知识培训内容,幼儿园教师计算机培训计划
  3. Linux远程批量工具mooon_ssh和mooon_upload使用示例
  4. android studio1.5 for mac,适用于Mac的Android Studio 1.5.x随机崩溃
  5. 《SolidWorks 2013中文版机械设计从入门到精通》一1.4 操作环境设置
  6. linux命令大全(持续更新)
  7. html select ajax,AJAX 动态加载后台数据 绑定select的方法
  8. 解决OneNote for Windows 10 不能打开onedrive上已有笔记本问题
  9. 打印机之——Mac电脑添加打印机
  10. 2022机器学习好网站大收藏
  11. 数学中的术语与常用表达
  12. [SQL]行转列和列转行
  13. linux 下如何添加用户、权限
  14. 谈一谈康得新的财务状况、大股东质押与股价走弱的原因
  15. python 线程 (概念+示例代码)
  16. 2010两个热点话题:物联网、低碳经济
  17. 一次完整的JVM堆外内存泄漏故障排查记录
  18. 苹果应当加速收购Snapchat 避免未来激烈竞争
  19. cocos3.5塔防游戏开发---复习cocos2dx结束(明天重启仙剑)
  20. AI鸟类识别实现自然生态环境数字化监测

热门文章

  1. 有着 30 多年经验的程序员最终被辞退了
  2. 集中式还是分布式?账务类数据库架构的选型
  3. 如何成为一名更出色的开发者?
  4. 前方预警!Windows Server 将默认需符合 TPM2.0,服务器商需在来年 1 月 1 日前适配相应规则...
  5. 5 月编程语言排行榜:C 重回第一,今年编程语言名人堂冠军还会是它吗? | 原力计划...
  6. 34000+技术博主齐聚,一周发文近 20,000 篇,网友:啥活动?
  7. C 语言漏洞最严重,PHP 最易受攻击,程序员该怎么写代码?
  8. 抗住百万人直播、被联合国推荐,起底飞书技术演进之路!
  9. Python 数据分析实战,揭秘国内顶尖医院分布现状!
  10. 特斯拉市值站上万亿元大关,BBA如何在“自动驾驶”上做空它?