异常表现不同

时间:2015-08-27 15:35:01

标签: c++ exception exception-handling

我正在玩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;
    }
} 

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

我原本以为被抓了例外。

我错过了一些基本的东西吗?

1 个答案:

答案 0 :(得分:5)

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

在早期的标准中,我相信你所期望的是会发生什么。但是在C ++ 11中,析构函数被隐式赋予noexcept规范,除非您明确表示不允许这样做,或者除非它们有一个子构件变量,其析构函数未标记为noexcept。 。(达到标准......)