C++抛出异常时,析构函数的调用

439 阅读1分钟

在C++中,当发生异常时,局部变量的析构函数会在栈展开过程中调用。栈展开是异常处理机制的一部分,用于清理在异常被抛出的代码路径上构造的所有对象。这个机制确保了即使在异常发生时,也能适当地释放资源。

举个例子,假设我们有一个简单的类,它在构造和析构时打印消息。然后我们在一个函数中创建该类的一个对象,并在对象创建后抛出异常。可以看到,在异常被抛出之前,该对象的析构函数将被调用,从而释放资源。

下面是具体的代码示例:

#include <iostream>
#include <exception>

// 定义一个简单的类,用于演示
class Demo {
public:
    Demo() {
        std::cout << "Demo 构造函数调用\n";
    }
    ~Demo() {
        std::cout << "Demo 析构函数调用\n";
    }
};

void functionWithException() {
    Demo demo; // 创建Demo对象
    std::cout << "在 functionWithException 中,即将抛出异常\n";
    throw std::exception(); // 抛出异常
}

int main() {
    try {
        functionWithException();
    } catch (const std::exception& e) {
        std::cout << "捕获到异常\n";
    }
    return 0;
}

在这个例子中,functionWithException 函数中创建了一个 Demo 类的对象。当异常被抛出时,Demo 对象的析构函数将在异常被传递到 catch 块之前调用,从而确保了资源的正确释放。你可以看到控制台上打印出了构造函数和析构函数的调用信息。