MST

星途 面试题库

面试题:C++ 类构造函数中的异常处理及资源管理

编写一个C++类,类中包含动态分配的资源(如内存、文件句柄等),构造函数需要对这些资源进行初始化。在构造函数执行过程中,可能会因为某些原因(如内存分配失败、文件打开失败等)抛出异常。请展示如何在构造函数中进行异常安全的资源管理,确保即使抛出异常,也不会造成资源泄漏,并且解释相关机制的原理。
24.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <fstream>
#include <memory>

class Resource {
public:
    Resource(const std::string& filename) {
        // 动态分配内存
        data = std::make_unique<int[]>(100);
        // 打开文件
        file.open(filename);
        if (!file) {
            throw std::runtime_error("Failed to open file");
        }
    }

    ~Resource() {
        // 自动释放动态分配的内存和关闭文件
        file.close();
    }

private:
    std::unique_ptr<int[]> data;
    std::ofstream file;
};

原理解释

  1. 智能指针:使用std::unique_ptr来管理动态分配的内存。std::unique_ptr是C++标准库提供的智能指针,它采用RAII(Resource Acquisition Is Initialization)机制。当Resource对象被创建时,std::unique_ptr<int[]>分配内存;当Resource对象被销毁(无论是正常结束生命周期还是因为异常导致提前销毁),std::unique_ptr<int[]>的析构函数会自动释放其所管理的内存,从而避免内存泄漏。
  2. RAII用于文件句柄:对于文件句柄,同样利用RAII机制。std::ofstream对象在Resource对象的构造函数中打开文件,在Resource对象的析构函数中关闭文件。如果在构造函数中抛出异常,Resource对象不会完全构造成功,其析构函数会被自动调用,从而关闭已经打开的文件,避免文件句柄泄漏。