gpt4 book ai didi

c++ - 为什么在创建数组期间在 C++ 中抛出未捕获的异常时不调用析构函数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:11 24 4
gpt4 key购买 nike

class XX
{
public:
static unsigned s_cnt;
XX()
{
++ s_cnt;
std::cout << "C XX " << s_cnt << "\n";

if ( s_cnt > 2 )
throw std::exception();
}

//private:
~XX()
{
std::cout << "~ XX\n";
}
};
unsigned XX::s_cnt = 0;

int main()
{
try
{
XX *xx = new XX[10];
} catch ( ... )
{
std::cout << "Exc\n";
}
}

输出:

C XX 1
C XX 2
C XX 3
~ XX
~ XX
Exc

但是当我删除 try-catch 时,我看到:

C XX 1
C XX 2
C XX 3
terminate called after throwing an instance of 'std::exception'
what(): std::exception
zsh: abort ./a.out

为什么 C++ 在第一种情况下调用析构函数而在第二种情况下不调用?

最佳答案

当您没有捕获到异常时(即它成为未捕获的异常并终止您的程序),C++ 不会为您提供任何保证析构函数实际被调用。

这为编译器提供了如何实现异常处理的余地。例如,GCC 首先搜索处理程序。如果找不到,它会立即中止,保留完整的堆栈信息以供调试。如果它确实找到了一个,它实际上会展开堆栈,销毁对象,直到它到达处理程序。这就是您看不到输出的原因:程序在销毁任何对象之前中止。

关于c++ - 为什么在创建数组期间在 C++ 中抛出未捕获的异常时不调用析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18491908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com