MST
星途 面试题库

面试题:C++指针函数异常处理与资源管理

假设你正在编写一个C++指针函数,该函数内部可能抛出多种类型的异常,同时涉及到动态分配的资源(如堆内存、文件句柄等)。请详细阐述如何在处理异常的同时,有效地管理这些资源以避免内存泄漏和资源泄漏,并给出实现代码。
28.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 资源管理策略
    • RAII(Resource Acquisition Is Initialization):这是C++中管理资源的常用方法。通过将资源封装在一个对象中,利用对象的构造函数获取资源,析构函数释放资源。这样,无论函数正常结束还是因异常退出,资源都能得到正确释放。
    • 智能指针:对于堆内存,使用智能指针(std::unique_ptrstd::shared_ptr)。std::unique_ptr适用于独占所有权的资源,std::shared_ptr适用于共享所有权的资源。智能指针会在其析构时自动释放所管理的内存。
    • 自定义资源管理类:对于非内存资源(如文件句柄),可以创建自定义的资源管理类,在构造函数中获取资源(如打开文件),析构函数中释放资源(如关闭文件)。
  2. 示例代码
#include <iostream>
#include <memory>
#include <fstream>

// 自定义文件句柄管理类
class FileHandle {
public:
    FileHandle(const std::string& filename) : file(filename) {
        if (!file) {
            throw std::runtime_error("Failed to open file");
        }
    }
    ~FileHandle() {
        if (file.is_open()) {
            file.close();
        }
    }
    std::ofstream& getFile() {
        return file;
    }
private:
    std::ofstream file;
};

// 指针函数,可能抛出异常并涉及动态资源
std::unique_ptr<int> pointerFunction() {
    std::unique_ptr<int> data(new int(42));// 使用std::unique_ptr管理堆内存
    FileHandle file("test.txt");// 使用自定义类管理文件句柄

    // 模拟可能抛出异常的操作
    if (true) {
        throw std::runtime_error("Some error occurred");
    }

    return data;
}

int main() {
    try {
        auto result = pointerFunction();
        std::cout << "Result: " << *result << std::endl;
    } catch (const std::exception& e) {
        std::cerr << "Exception caught: " << e.what() << std::endl;
    }
    return 0;
}

在上述代码中:

  • std::unique_ptr<int>用于管理动态分配的整数内存。即使pointerFunction函数因异常退出,std::unique_ptr的析构函数也会自动释放该内存。
  • FileHandle类封装了文件句柄的获取(打开文件)和释放(关闭文件)操作。在pointerFunction函数中,FileHandle对象在栈上创建,无论函数正常结束还是因异常退出,其析构函数都会确保文件被正确关闭。

这样就有效地避免了内存泄漏和资源泄漏。