📅  最后修改于: 2023-12-03 15:29:42.504000             🧑  作者: Mango
在 C++ 中,一个对象被销毁时,会先调用它的析构函数。析构函数用于释放对象所占用的资源,如打开的文件、分配的内存等。在这个问题中,我们将探讨以下问题:当一个类中有多个对象时,它们的析构函数的执行顺序是什么?
假设有下面这个简单的 C++ 类:
class Demo {
public:
Demo(int id) : id_(id) {}
~Demo() {
std::cout << "Object " << id_ << " destroyed\n";
}
private:
int id_;
};
我们创建了两个 Demo
对象:
int main() {
Demo d1(1);
Demo d2(2);
return 0;
}
输出为:
Object 2 destroyed
Object 1 destroyed
为什么输出的顺序和我们创建对象的顺序相反?析构函数的执行顺序与何相关?
在上面的例子中,我们创建了两个 Demo
对象 d1
和 d2
,它们会被销毁在 main
函数结束时。当程序执行到 return 0;
时,main
函数的栈帧被弹出,并把 d2
对象的地址作为参数传递给 d2
的析构函数。然后 d2
的析构函数开始执行,输出 "Object 2 destroyed"
,然后从栈中弹出对象 d2
。
接着,把 d1
对象的地址作为参数传递给 d1
的析构函数。然后 d1
的析构函数开始执行,输出 "Object 1 destroyed"
,然后从栈中弹出对象 d1
。
所以,析构函数的执行顺序与对象在栈中的顺序相反。也就是说,最后创建的对象最先被销毁,而最先创建的对象最后被销毁。
在 C++ 中,析构函数用于释放对象所占用的资源。当有多个对象时,它们的析构函数的执行顺序与它们在栈中的顺序相反。这是因为栈是一个先进后出的数据结构,在函数执行结束时,栈帧被依次弹出。