8.3局部对象
自动对象:自动对象的存储分配定义发生在它的函数被调用时。未初始化的自动对象包含一个随机的位模式,是该存储区上次被使用的结果。它的值被称为未指定的。
寄存器对象:函数中频繁使用的对象可以用register声明。常见于循环语句中。寄存器变量可以提高程序的运行速度。
静态局部变量:当一个局部变量的值必须在多个函数之间调用保持有效时,则该局部变量可以声明为静态局部变量。常见于递归函数的调用。未初始化的静态局部变量会被初始化为0.
8.4动态分配的对象
动态分配对象:全局对象和局部对象的生命期是严格定义的,程序员不能以任何方式改变它们的生命期。但有时需要创建一些生命期能被程序员控制的对象,它们的分配和释放可以根据程序运行中的操作来决定,这样的对象被称为动态分配对象。
动态分配对象被分配在程序的空闲存储区的可用内存池中。
8.4.1单个对象的动态分配与释放:
(1)动态内存分配:通过new表达式在运行时刻从空闲存储区中分配内存,空闲存储区分配的内存是未初始化的,空闲存储区的内存包含随机的位模式。
eg1:int * pi =new int;
我们常用new表达式对创建的对象进行初始化。
eg2:int *pi=new int(0);
/*eg2解读一:pi指向一个int型对象,该对象的值为0。括号内的表达式被称为初始化式。初始化式不一定是常量,任意能够转换成int型结果的表达式都是有效的初始化式。
eg2解读二:new表达式的操作序列如下:从空闲存储区分配对象,然后用存储区的值分配该对象。为从空闲存储区分配对象,new表达式调用库操作符new()。eg2表达式与下列代码大体等价:
int ival=0;//创建一个用0初始化的int型对象。
int *pi=&ival;//现在指针指向这个对象。
不同之处,eg2中pi指向的对象由库操作符new()分配,位于程序的自由存储区中。*/
(2)“动态内存释放”引入原因:由于new表达式使用的是空闲存储区得资源,而该资源又十分有限,一旦被耗尽将导致new表达式失败。如果得不到要求的内存,会抛出bad_alloc异常。
我们常用delete表达式调用库操作符delete(),把内存还给空闲存储区。
delete表达式应用:a只能应用指向的内存是用new表达式从空闲存储区分配的指针上。b.应用在指向空闲存储区以为内存的指针上,会使程序运行期间出现未定义的行为。c.delete表达式运用在值为0的指针(即不指向任何对象的指针)不会引起任何麻烦。见eg3.
eg3:
void f(){
int i;
string str="dwase";
int *pi=&i;
short *ps=0;
double *pd=new double(33);
delete str; //糟糕,"dwase"不是动态对象。
delete pi; //糟糕,pi指向i,一个局部对象。
delete ps; //安全,值为0的指针。
delete pd;//安全。