gpt4 book ai didi

c++ - 异常表现不同

转载 作者:行者123 更新时间:2023-11-30 01:13:25 25 4
gpt4 key购买 nike

我正在研究 C++ 异常,但在编写程序时我无法解释输出。所以我的理解是,每当抛出异常时,程序都会寻找匹配的 try block ,如果当前范围内没有一个,则所有堆栈变量都将被销毁,如果遇到 try ,将搜索调用者以查找 try block 搜索匹配的 catch block 。在移动到匹配的 catch block 之前,try block 内的所有堆栈变量都被销毁。如果找到一个 catch block ,则处理异常并且程序在 catch block 之后继续。但是在下面的程序中,我没有得到预期的输出:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

class Bomb {
int x;
public:
Bomb( ):x(0) {
cout<< "callling constructor " << endl;
}

~Bomb() {
cout<<" Calling destructor " << endl;
throw "boom";
}

void * operator new( size_t size ) throw() {
cout<<" Calling operator new " << endl;
return malloc(size);
}

void operator delete( void * p ) throw() {
cout<<" Calling operator delete " << endl;
if( p != 0 ) free(p);
}
};

void f() {

//Bomb myBomb;

Bomb *pBomb = new Bomb();
try {
delete pBomb;
} catch( ... ) {
cout<< " caught exception " << endl;
}

}


int main( int argc, char ** argv ) {

try {
f();
}
catch( char * message ) {
cout << " caught exception in main " << endl;
}
}

输出是: 调用运营商新 调用构造函数 调用析构函数然后它崩溃了

我期待捕获异常。

我是否遗漏了一些基本的东西?

最佳答案

无论您使用的是 C++11 还是更早的标准,这都非常重要。

在早期的标准中,我相信您所期望的就是会发生的事情。但是在 C++11 中,析构函数被隐式地赋予了 noexcept 规范,除非你明确地不给它们这个,或者除非它们有一个子成员变量,其析构函数没有被标记为 noexcept...(达到标准...)

关于c++ - 异常表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32253715/

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