)
%7&
%4+6',&
""-%-""""&
(8(&
(%9(&
/
空函数
压入 内的变量
#+,函数为程序的入口,程序开始
运行时, 中的指令寄存器被设置
为 中
#+,函数的位置
声明指向 ( 类的指针
9 操作符在 中构造 ( 类的
实例
并将指针 ( 指向 ( 实例的入口
地址
将上面的程序编译,系统将各个函数的代码存放到代码区,将静态变量,常量,
全局变量保存在全局数据区。运行时, 首先执行 #+,函数中的代码,
系统向栈区内压入 #+,函数的局部变量 ,程序运行到对 4+,函数的调用时,
系统将 指令寄存器压栈,并将其内容设定为 4+,的地址,控制转到 4+,
函数。4+,函数在栈区中创建其局部变量 5626完成 52 的运行后将结果以临
时变量的方式返回给调用者。 之后,系统清空 4+,在栈区中存放的变
量,并将先前压栈的指令寄存器内容出栈6转而执行 #+,中接下来的代码。
声明 (8( 后,# 在栈区中创建一个指针变量,然后调用 9 在堆区
中创建一个 ( 的实例,并将 ( 指向它。运行该程序,我们可以发现,
( 类的构造函数被执行,但析构函数没有执行。原因是这样的,栈区内的变
量值在创建这个变量的函数以内有效,例如,函数 4返回后,形参 562 从栈
中清除,# 返回后,指针变量 ( 也被从栈区中清除;但指针指向的堆
区中的 ( 实例,仍然存在,类的析构函数没有被调用。由此我们可以看出栈
区和堆区得区别:
栈区+,*存放程序的局部数据,即各个函数中的局部变量
堆区+,*存放程序运行中的动态数据
对栈区的使用,在编译的时候就已经确定,而堆区的使用是在程序运行中动态
进行的。堆区中的数据的创建和删除要由程序员来自己控制,系统不会对它像
栈区那样进行自动的清除,使用堆区要防止产生例子程序中那样的错误,用
9 创建对象时候,使用完毕后一定要把它 6不然会出现内存泄漏
+##2,。
栈区和堆区的区别,后文还会有进一步的分析。
评论2