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

否则您的代码会出现未定义的行为。