转自:http://wenzongliang.iteye.com/blog/1866629

操作系统启动程序时会加载程序代码到内存(叫程序的代码区),然后创建进程PCB为进程分配内存资源(数据区,32系统为4GB)c/c++程序的数据区被c/c++分为5个区,他们分别是全局/静态存储区、常量存储区、栈、堆、自由存储区。

   全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

  常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。

  栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

  堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

  自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

以一小段代码为例,提几个问题

#include "iostream"
using namespace std;
void ss(int a)
{
int b=5;
cout<<b+a<<endl;

}
int main()
{
ss(5);

int * p=new int;

delete p;
return 0;
}

1、这个EXE一运行必然要占用一块内存,这块内存是连续的吗?

2、既然调用了函数,一定有一块内存吧。内存是在这个EXE之内吗?

3,自由存储是一个概念吗

4、int * p=new int; 这句话开辟的内存地址在EXE的范围内吗?

5、是什么时候产生的?是程序一运行的时候?还是调用函数的时候-

--------------------------------------

1. exe运行的时候,系统会创建一个进程,同时会分配一块独立的内存空间给该进程,这个内存空间在32位系统上是从0x00000000到0xFFFFFFFF, 4G的空间大小。

2. CPU时间分配的单位是线程,所有的函数都是在一个线程里面执行的,当线程创建时,系统会分配一段内存和寄存器给这个线程,线程就可以调用函数了。内存是在进程内存空间里面。exe是一个文件的概念,只有当exe运行之后,系统创建的exe的进程实例之后,才会分配内存,所有内存是在exe的进程实例中的,在exe之内的说法不妥。

3.自由存储不是一个概念。一般而言,自由存储是指CRT(C运行时库)通过malloc,free函数管理的内存。特指通过new,delete管理的内存。但是在部分编译器的实现上这两块内存都是同一种管理方式。

4. int* p = new int 如上述,在exe的进程空间内存空间里面。

产生的时机如2所讲,是在一个线程创建的时候。

在C++程序中内存是分为5块的,注意区分

1.

2.

3.自由存储

4.全局/静态存储

5.文字常量存储

c/c++程序中内存区划分的更多相关文章

  1. java中内存的划分

    java中内存的划分 栈(stack):存放的都是方法中的局部变量.方法的运行一定要在栈当中运行. 局部变量:方法的参数,或者是方法{}内部的变量 作用域:一旦超出作用域,立刻从占内存当中消失. 堆( ...

  2. JVM执行Java程序时内存的划分

    Java虚拟机在执行Java程序过程中会把它所管理的内存区域划分为若干个不同的数据区域. Java虚拟机所管理的内存包括以下几个运行时区域: 1.程序计数器(Program Couter Regist ...

  3. C/C++中内存区域划分大总结

    C++作为一款C语言的升级版本,具有非常强大的功能.它不但能够支持各种程序设计风格,而且还具有C语言的所有功能.我们在这里为大家介绍的是其中一个比较重要的内容,C和C++内存区域的划分. 一. 在c中 ...

  4. FW:程序在内存的划分(转)

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

  5. C/C++程序中内存被非法改写的一个检测方法

    本文所讨论的“内存”主要指(静态)数据区.堆区和栈区空间(详细的布局和描述参考<Linux虚拟地址空间布局>一文).数据区内存在程序编译时分配,该内存的生存期为程序的整个运行期间,如全局变 ...

  6. C语言中内存分配 (转)

    在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...

  7. 【转】C语言中内存分配

    原文:C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要 ...

  8. C语言中内存分配

     C语言中内存分配   在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要 ...

  9. iOS程序中的内存分配 栈区堆区全局区

    在计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同.一.内存分区 栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等.栈是系统数据结构,对 ...

随机推荐

  1. JVM 学习资料

    资料 网址 JVM Options - The complete reference http://jvm-options.tech.xebia.fr/ Java HotSpot VM Options ...

  2. Tools分类随笔链接整理贴(不定期更新)

    1.编程开发工具 Vs2012安装介绍   https://www.cnblogs.com/fzxiaoyi/p/12041854.html Vs2012帮助文档安装介绍  https://www.c ...

  3. day17_7.19包与logging模块,深浅拷贝

    一.包 在模块的定义里,模块就是方法的集合,可以将一些常用的方法封装到一个py文件中,通过调用使用,而且,其中的表现形式也有以包的形式导入. 其实,包就是一系列模块的结合体,表示形式就是一个文件夹,在 ...

  4. VUE小练习(按钮颜色,数组映射)

    VUE小练习(按钮颜色,数组映射) ## 1.有红.黄.蓝三个按钮,以及一个200x200矩形框box, 点击不同的按钮,box的颜色会被切换成指定的颜色 ''' 解法一:我本来的思路,把三个按钮绑定 ...

  5. VIJOS-P1421 更换轮胎

    JDOJ 1506: VIJOS-P1421 更换轮胎 https://neooj.com/oldoj/problem.php?id=1506 Description 经过数周的期待,比赛终于正式开始 ...

  6. css样式添加错误导致烦扰

    省厅和市州 两个ul 之间切换  分别能显示两者对应的内容 但是在做过程中,出现省厅界面有市州的内容… 找了半天,发现是css的问题   layui-show的多添加 算是把首页内容的任务解决了至于c ...

  7. <Random>382 380

    382. Linked List Random Node class Solution { ListNode node; Random random; /** @param head The link ...

  8. PATA1075 PAT Judge (25 分)

    The ranklist of PAT is generated from the status list, which shows the scores of the submissions. Th ...

  9. [LeetCode] 142. Linked List Cycle II 单链表中的环之二

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. To r ...

  10. thinkphp5.0 - nginx 配置

    上面介绍的是 thinkphp url 的访问方式,按照上面的访问方式配置nginx服务器配置,如下所示: server { listen 8090; server_name localhost 17 ...