域和生命期3_对象

 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;//安全。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值