析构函数的奇怪调用顺序

Strange call order of destructors

本文关键字:调用 顺序 析构函数      更新时间:2023-10-16

我知道当我将对象传递给具有没有引用的参数的函数时,将调用复制构造函数;当我在函数中返回对象时也是如此。当我尝试将函数分配给本地对象时,出现问题。析构函数的顺序不是通常的顺序,我不知道为什么。

class myClass{
  int x;
  static int y;
  string name;
public:
    myClass(int i=10):x(i){ y++;cout<<"constr "<<y<<"n"; name= "constr" +to_string(y) +'n';}
    myClass(const myClass&ob){y++; x= ob.x; cout<<"copy-c "<<y<<" n"; name= "copy-c" +to_string(y) +'n';}
    ~myClass(){cout<<"destr " +name +'n'; }
};
int myClass::y;
myClass f(myClass ob)
{
    return ob;
}
//main
myClass ob;
myClass s=f(ob);

输出:
结构 1
复制-C 2
复制-C 3
Destr copy-c2
Destr copy-C3
Destr Constr1

省略返回值的副本;f 的返回值直接构造在 s 的空间中。

所以,constr 1ob的构造函数。 copy-c 2是临时传递给fcopy-c 3f返回值的构造函数,也是s的构造函数。在分号处,临时copy-c 2被破坏。在main结束时,sob按此顺序被摧毁。