MST

星途 面试题库

面试题:C++中析构函数重载时异常处理的基础应用

在C++中,假设有一个类`MyClass`,它有多个析构函数重载(虽然实际很少这样做),其中一个析构函数在清理资源时可能抛出一个`std::runtime_error`异常。请编写代码示例展示如何在调用这个析构函数时正确处理该异常,同时简要说明析构函数中抛出异常可能带来的风险。
24.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

代码示例

#include <iostream>
#include <stdexcept>

class MyClass {
public:
    // 模拟资源
    int* data;
    MyClass() {
        data = new int(10);
    }

    // 析构函数1
    ~MyClass() {
        try {
            // 模拟可能抛出异常的资源清理操作
            if (data) {
                delete data;
                data = nullptr;
                throw std::runtime_error("Resource cleanup failed");
            }
        } catch (const std::runtime_error& e) {
            std::cerr << "Caught in destructor: " << e.what() << std::endl;
        }
    }

    // 析构函数2(示例,虽然实际很少这样做)
    ~MyClass(int) {
        if (data) {
            delete data;
            data = nullptr;
        }
    }
};

int main() {
    try {
        MyClass obj;
    } catch (const std::runtime_error& e) {
        std::cerr << "Caught in main: " << e.what() << std::endl;
    }
    return 0;
}

析构函数中抛出异常的风险

  1. 栈展开问题:当析构函数抛出异常时,如果这个异常没有在析构函数内部被捕获,它将在栈展开过程中与其他正在进行的栈展开操作冲突,可能导致程序直接调用std::terminate,从而异常终止程序。
  2. 资源泄漏:如果析构函数在抛出异常时没有正确清理所有资源,可能会导致资源泄漏。例如,在上述代码中,如果没有捕获std::runtime_error异常,data指针可能无法被正确释放,从而造成内存泄漏。
  3. 难以调试:析构函数中的异常可能使得调试变得更加困难,因为异常发生的位置可能在对象生命周期结束时,难以准确追溯到问题根源。