我正在玩C ++异常,但在编写程序时我无法解释输出。所以我的理解是每当抛出异常时程序会查找匹配的try块,如果当前作用域中没有一个,则所有堆栈变量都将被销毁,并且如果遇到try,将调用调用者的try块。搜索匹配的catch块。在移动到匹配的catch之前,try块中的所有堆栈变量都被销毁。如果找到一个catch块,则处理异常并且在catch块之后程序继续。但是在以下程序中,我没有按预期获得输出:
#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;
}
}
输出是: 呼叫运营商新 调用构造函数 调用析构函数 然后它崩溃了
我原本以为被抓了例外。
我错过了一些基本的东西吗?
答案 0 :(得分:5)
无论您使用的是C ++ 11还是更早的标准,都很重要。
在早期的标准中,我相信你所期望的是会发生什么。但是在C ++ 11中,析构函数被隐式赋予noexcept
规范,除非您明确表示不允许这样做,或者除非它们有一个子构件变量,其析构函数未标记为noexcept
。 。(达到标准......)