2016-10-09 19 views
0

クラスコンストラクタから例外がスローされると、プログラムがクラッシュします。デバッグモードで実行中に、次のエラーが表示されます。「VirtualCtor.exeの0x74A2DB18で処理できない例外:Microsoft C++例外:メモリロケーション0x00000000の[rethrow]」リリースモードでもクラッシュします。これはスローが正確なキャッチハンドラを見つけず、std :: terminate()が呼び出されるためです。しかし、私はキャッチ(...)がこれを処理すべきであるという理解がありました。誰かがキャッチと一緒に使う必要があるハンドラーを私に知らせることはできますか?コンストラクタから例外がスローされたときにアプリケーションがクラッシュする

#include<iostream> 
#include<exception> 
using namespace std; 

class MyClass 
{ 
public: 
     MyClass() { cout << "Default Ctor" << endl; 
     throw; //runtime exception. 
} 
~MyClass() 
{ 
    cout << "Destructor called" << endl; 
} 
}; 

int main() 
{ 
    MyClass*vpt = nullptr; 
    try { 
     vpt = new MyClass; 
    } 
    catch (...) { 
     delete vpt; 
     cout << "Exception"<< endl; 
    } 

    return 0; 
} 

変更コードthrow bad_alloc();例外をキャッチし、コードはもはやクラッシュしませんが、関数/コンストラクタからthrowを呼び出すだけで何が起こるのか理解する必要があります。

ありがとうございました。

+2

'throw;'式を指定しないで、現在アクティブな例外を再スローします。それは、 'catch'節の外で実行されるとき、またはそこから呼び出される関数が未定義の挙動を示す。 –

+0

@IgorTandetnik:答えのセクションは下にあります。これはコメントセクションです。 –

答えて

2

あなたはではありません。例外をスローします。あなたはちょうどthrowを書いていますが、は再スローされます例外がすでにスローされています。この場合、プログラムは存在しないので、プログラムには未定義の動作があります。したがって、クラッシュ。

何かを投げたい場合は、実際に何かを投げなければなりません!

MyClass() 
{ 
    cout << "Default Ctor" << endl; 
    throw std::runtime_exception("Testing exception handling"); 
} 
+0

私は、あなたが何かを提供せずに「スロー」を書いたときに期待したことを本当に理解していないことを認めなければなりません。 –

+0

返事をありがとう。それは私の質問に答える。 –

関連する問題