MST

星途 面试题库

面试题:C++嵌套类生命周期与资源管理

考虑一个复杂的C++程序,外层类A包含嵌套类B,B类中有一个动态分配的资源(比如一个指向大数组的指针)。当A类对象被销毁时,如何确保B类对象中的资源也能正确释放,并且不会出现内存泄漏?请详细描述资源管理的策略和具体实现代码。
21.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 资源管理策略
    • 使用RAII(Resource Acquisition Is Initialization)原则,即通过对象的构造来获取资源,通过对象的析构来释放资源。
    • 对于动态分配的指针,使用智能指针(如std::unique_ptrstd::shared_ptr)来管理,避免手动释放资源带来的内存泄漏风险。
  2. 具体实现代码
#include <iostream>
#include <memory>

class A {
public:
    class B {
    public:
        B() : data(std::make_unique<int[]>(1000)) {
            // 初始化大数组
        }
        ~B() = default; // 智能指针会自动释放数组资源
    private:
        std::unique_ptr<int[]> data;
    };

    A() {
        b = std::make_unique<B>();
    }
    ~A() = default; // 智能指针会自动释放B对象资源
private:
    std::unique_ptr<B> b;
};

int main() {
    {
        A a;
        // 当a离开作用域时,A的析构函数会被调用,进而B的析构函数也会被调用,释放资源
    }
    return 0;
}

在上述代码中:

  • A类包含一个std::unique_ptr<B>成员变量b,当A对象构造时,会创建B对象并由std::unique_ptr管理。
  • B类包含一个std::unique_ptr<int[]>成员变量data,用于管理动态分配的大数组。B的构造函数使用std::make_unique<int[]>(1000)来分配数组资源,析构函数默认,由std::unique_ptrB对象销毁时自动释放数组资源。
  • A对象被销毁时,其析构函数会自动调用b的析构函数,从而确保B对象被正确销毁,B对象中的资源也能正确释放,避免内存泄漏。