很久没来,有点陌生了~很高兴各位看客能搜到这篇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;
}
};