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;
	}
};




你可能感兴趣的:(C++,栈)