C/C++中变量的可见性与生命期区别的本质原因

可见性与生命期

可见性又可称为:作用域,它是“栈”这种存储方式的表现形式。不管是全局的可见性(全局作用域)、还是局部可见性(局部作用域),从一个对象(或称为变量、实例)的入栈(开始可见)到其出栈(变成不可见),是该对象的整个的作用域。

可见性与生命期是两个分立的概念,但似乎又存在这某种联系。比如:如果一个对象变得不可见了,那么似乎该对象的生命期也就结束了。而“堆”、“全局静态区”、“常量区”这三种不同于“栈”的存储方式却又告诉我们,当对象不可见的时候,其生命期可能并没有结束。。。。那么到底是什么造成了这两种概念上的差异?而使得我们大多数初学C/C++语言的人的迷惑不解的呢?

答案就是:指针!!!

原因如下:

当我在上面的论述中提到“对象”(或称变量、实例)的时候,其实,我并没有将“对象本身”“对象所处的内存的地址”(即指针的值)加以区分。对于基本数据类型,往往很少用到这种区分,因为基本类型的变量往往都直接存放在“栈”上(当然也可以通过动态内存分配将其放在堆中,如:int* p = new int(1);),所以不需要“间接寻址”(根据指针找到实际对应的对象)

而如果我们都是采用动态内存分配的方式,即用指针来表示其所对应的对象时(如:Object* o = new Object(); ),这种可见性和生命期 的分立就体现出来了:即指针对应的是可见性,而指针所指向的对象(也即指针所指向的内存)对应的是生命期。因为指针是在栈上分配存储的(指针也是一个变量),所以其可见性如前面所述,是栈这种存储方式的表现形式。当指针出栈时,它本身不可见了,从而也间接的导致了它所指向的对象变得不可见,但这时这个对象本身的生命期并没有结束,因为对象本身并不是在栈上分配空间的。

这个时候,如果在其他函数或代码中不再有任何指针保存该对象的地址,那么这个对象就将不可以继续被访问,即该对象已经不可见了,但是其生命期并为结束,所以对于的内存并未被收回。例 : 函数内的静态变量,堆分配的变量 都可以属于这种情况

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值