C++ - 析构函数的调用次数超过预期
C++ - Destructor is called more times than expected
考虑以下代码:
class C1
{ public:
C1(){ cout<<"CONSTR WAS HERE"<<endl; }
C1(const C1&ob){ cout<<"COPY CONSTR WAS HERE"<<endl; }
~C1(){ cout<<"DESTR WAS HERE"<<endl; }
}
void f1(C1 x){ }
int main()
{
C1 c1;
f1(c1);
}
如果我们运行原样的代码,我们得到:
CONSTR WAS HERE
COPY CONSTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
从我的角度来看,这是完全可以理解的。但是,如果我们将函数"f1"修改为:
C1 f1(C1 x){ }
而不是
void f1(C1 x){ }
我们得到:
CONSTR WAS HERE
COPY CONSTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
我不太清楚为什么。
启用您的警告:
warning: no return statement in function returning non-void [-Wreturn-type]
你的程序中有undefined behavior,这意味着任何事情都有可能发生。编译器很可能"returning an undefined instance of C1
here",导致析构函数被调用
程序可能会崩溃或执行任何其他操作,具体取决于您的compiler/flags/machine。
将 C1 f1(C1 x){}
修改为实际 return 的内容,您的输出将符合预期 (Demo)
C1 f1(C1 x){ return {};}
CONSTR WAS HERE
COPY CONSTR WAS HERE
CONSTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
否则您的代码会出现未定义的行为。
考虑以下代码:
class C1
{ public:
C1(){ cout<<"CONSTR WAS HERE"<<endl; }
C1(const C1&ob){ cout<<"COPY CONSTR WAS HERE"<<endl; }
~C1(){ cout<<"DESTR WAS HERE"<<endl; }
}
void f1(C1 x){ }
int main()
{
C1 c1;
f1(c1);
}
如果我们运行原样的代码,我们得到:
CONSTR WAS HERE
COPY CONSTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
从我的角度来看,这是完全可以理解的。但是,如果我们将函数"f1"修改为:
C1 f1(C1 x){ }
而不是
void f1(C1 x){ }
我们得到:
CONSTR WAS HERE
COPY CONSTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
我不太清楚为什么。
启用您的警告:
warning: no return statement in function returning non-void [-Wreturn-type]
你的程序中有undefined behavior,这意味着任何事情都有可能发生。编译器很可能"returning an undefined instance of C1
here",导致析构函数被调用
程序可能会崩溃或执行任何其他操作,具体取决于您的compiler/flags/machine。
将 C1 f1(C1 x){}
修改为实际 return 的内容,您的输出将符合预期 (Demo)
C1 f1(C1 x){ return {};}
CONSTR WAS HERE
COPY CONSTR WAS HERE
CONSTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
否则您的代码会出现未定义的行为。