在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 块之前调用,从而确保了资源的正确释放。你可以看到控制台上打印出了构造函数和析构函数的调用信息。