MST

星途 面试题库

面试题:C++ 复杂对象生命周期中析构函数调用分析

假设有一个类A,其成员变量包含另一个类B的对象以及指向类C对象的指针,类B也有自己的动态分配资源。在类A对象的生命周期结束时,详细描述析构函数的调用顺序,以及如何正确编写类A的析构函数来确保所有资源都被妥善释放。
46.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 析构函数调用顺序
    • 当类A对象的生命周期结束时,首先会调用类A自身的析构函数。
    • 在类A的析构函数中,如果类A包含类B的对象成员,那么会调用类B的析构函数来释放类B的动态分配资源。
    • 接着,类A析构函数中负责释放指向类C对象的指针所指向的资源(如果有)。
    • 最后,类A自身的析构函数执行完毕,类A对象被完全销毁。
  2. 类A析构函数的正确编写
class B {
public:
    ~B() {
        // 释放B的动态分配资源
    }
};

class C {};

class A {
private:
    B b;
    C* cPtr;
public:
    A() {
        cPtr = new C();
    }
    ~A() {
        // 释放类C对象的资源
        delete cPtr;
        // 此时b的析构函数会自动调用,释放类B的资源
    }
};

在上述代码中,类A的析构函数首先释放了指向类C对象的指针cPtr所指向的资源,然后类A成员变量b(类B的对象)的析构函数会自动调用,从而确保类B的动态分配资源也被释放。这样就保证了类A对象生命周期结束时所有资源都被妥善释放。