📜  C ++ |析构函数|问题5(1)

📅  最后修改于: 2023-12-03 15:29:42.504000             🧑  作者: Mango

C++ | 析构函数 | 问题5

简介

在 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 对象 d1d2,它们会被销毁在 main 函数结束时。当程序执行到 return 0; 时,main 函数的栈帧被弹出,并把 d2 对象的地址作为参数传递给 d2 的析构函数。然后 d2 的析构函数开始执行,输出 "Object 2 destroyed",然后从栈中弹出对象 d2

接着,把 d1 对象的地址作为参数传递给 d1 的析构函数。然后 d1 的析构函数开始执行,输出 "Object 1 destroyed",然后从栈中弹出对象 d1

所以,析构函数的执行顺序与对象在栈中的顺序相反。也就是说,最后创建的对象最先被销毁,而最先创建的对象最后被销毁。

总结

在 C++ 中,析构函数用于释放对象所占用的资源。当有多个对象时,它们的析构函数的执行顺序与它们在栈中的顺序相反。这是因为栈是一个先进后出的数据结构,在函数执行结束时,栈帧被依次弹出。