小白一个,下面代码调用f(Monitor*)时i的值增加超过应有的值
而且多次调用和调用一次值不同
若调用f()一切正常,里面的monitor是全局的
以上三点我都不能理解 还请各位大神指教
错误原因:
main函数结束时:m先被释放、析构,
然后析构静态的mon,这时输出的i,已经是个随机的。
#include<iostream>
using namespace std;
class Monitor
{
int i;
public:
Monitor(){ i=0; cout<<"Monitor 构造:i="<<i<<endl; }
~Monitor(){ cout<<"Monitor 析构:i="<<i<<endl; }
void print()
{ cout<<" "<<i<<endl; }
};
class Monitor2
{
Monitor* mon;
public:
Monitor2(Monitor* a):mon(a)
{
cout<<"Monitor2 constructor ";
mon->print();
}
~Monitor2()
{
cout<<"Monitor2 destructor ";
mon->print();
}
};
void f(Monitor* a)
{
static Monitor2 mon(a);
}
void main()
{
Monitor m;
cout<<"ok1"<<endl;
f(&m);
cout<<"ok2"<<endl;
}
提问不能上传图片 代码如下
第一个:
static Monitor2 mm(mo); //静态变量,程序一执行就要分配空间、初始化,而mo是局部变量,还未存在。所以错误。
第二个
static Monitor2 mm(&mo_extern); // mo_extern是全局变量,在mm初始化时,mo_extern已经存在,所以没问题。
函数中的静态变量,只是在程序开始分配内存初始化,执行一次,以后该条语句不再执行。
void main()
{
Monitor m;
cout<<"ok1"<<endl;
f(&m);
cout<<"ok2"<<endl;
f(&m);
cout<<"ok2"<<endl;
f(&m);
cout<<"ok2"<<endl;
}