C++ - 析构函数的调用次数比预期的多

Emy*_*scu 3 c++ oop constructor destructor

考虑以下代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

如果我们按原样运行代码,我们得到:

CONSTR WAS HERE
COPY CONSTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
Run Code Online (Sandbox Code Playgroud)

从我的观点来看,这是完全可以理解的.但是,如果我们将函数"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
Run Code Online (Sandbox Code Playgroud)

我不太清楚为什么

Vit*_*meo 12

启用警告:

警告:函数中没有return语句返回非void [-Wreturn-type]

您的程序中有未定义的行为,这意味着任何事情都可能发生.编译器很可能"返回C1此处未定义的实例",这会导致析构函数被调用.

程序可能会崩溃或执行任何其他操作,具体取决于您的编译器/标志/机器.


And*_*dyG 9

修改C1 f1(C1 x){}为实际返回的内容,您的输出将按预期进行(演示)

C1 f1(C1 x){ return {};}
Run Code Online (Sandbox Code Playgroud)

构造WAS HERE
COPY构造WAS HERE
构造WAS HERE
DESTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE

否则您的代码会显示未定义的行为.