相关问题:

1. 运行一个C++程序,系统会为程序安排哪几片存储区域?分别存放什么?

  • 静态区全局区):存放静态变量(包括静态数据成员);
  • :存放局部非静态变量、函数的形式参数;
  • 程序区:存放机器语言的程序代码;
  • :系统掌握的未分配的内存区。用于存放动态分配的对象, 当你使用 _malloc_和_new_等进行分配时,所得到的空间就在堆中。动态分配得到的内存区域附带有分配信息, 所以你能够 free和delete它们。
  • 注:形参是变量,发生函数调用时在栈中安排这些变量的存储空间。

2. 例题:

画出如下程序运行到return之前的内存图,图中要表示出各个变量、对象以及main函数的位置。

CMyDate例题

答案:

例题答案  

程序的运行过程说明:

  1. 从EXE文件中把机器语言代码调入内存的程序区
  2. x是全局变量,随着程序被调进内存就安排了内存空间,在静态区,并以2000、1、2为实际参数调用构造函数,初始化x的各个数据成员
  3. 系统调用main,这是每个C++程序的必有步骤
  4. 进入main内部
  5. 创建局部对象y,在动态区,并以1988、3、4为实际参数调用构造函数,初始化y
  6. 安排局部变量q,是指针变量,在动态区中安排
  7. 创建无名对象,在堆中安排,并以2020、5、6为实际参数调用构造函数
  8. 开始执行调用我们后来在程序的空行加上去的那条语句x.Show( )
  9. 入口参数传递,把x的地址传递给Show函数,使得Show函数中的this就是该地址
  10. 进入Show内部执行,显示
  11. 从Show返回
  12. 执行main的return,返回系统

对比表格:

堆和栈的对比表格 堆和栈的对比表格全局/静态存储区和常量存储区的对比 全局/静态存储区和常量存储区的对比