C++栈带来的思考

         很久没来,有点陌生了~很高兴各位看客能搜到这篇bolg。好了闲话留言中聊^_^

        今天要讲的总结下两个要点:变量的生存期和内存管理机制是两码事;栈顶的地址是编译时候确定的。

上代码

class cc
{
private:
	int *t;
public: 
	cc::cc()
	{
		tt();
		std::cout<<t<<"   "<<*t<<std::endl;
	}
	cc::~cc(){}
	void cc::tt()
	{
		int a = 10;
		t=&a;
	}
};

楼主深知看别人代码的痛苦所以最大限度有最少代码说明问题。那么问题切入点在哪儿?当然是*t可能输出正确了~原因正是我说的上面两点。那么结合代码说说吧,解决那些习惯阅读的人吧~

首先变量a是分配在栈上的变量所以a已经被销毁,前面说了变量生存期结束了和内存管理是两码事,那么最好的理解就是分配出来的这块内存实际上被没有被系统回收,他依然被程序占有着。有人将这个理解为内存消失,又是概念题,狂汗~

剩下就是顺道说下第二点了,实际上对于函数 tt() 其变量的位置分配栈顶地址在编译时候就已经确定了。这一部分看我转载的下一篇吧,太多了

     总结一下吧,对于变量a而言在构造函数中调用 tt(); 语句完了之后就失效了这是变量生存期决定的,然而其分配在栈中的内存并没有被系统回收也就是数据没有被修改,所以指针 t 指向的这块地址依然能够正确输出。那么这块地址何时会被系统处理掉,我再上传一份代码和截图大家就懂了

class cc
{
private:
	int *t;
public: 
	cc::cc()
	{
		pritf();
		std::cout<<t<<"   "<<*t<<std::endl;
	}
	cc::~cc(){}
	void cc::pritf()
	{
		int c =0;
		tt();
		std::cout<<&c<<std::endl;
	}
	void cc::tt()
	{
		int a = 10;
		t=&a;
	}
};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值