2017-04-20 40 views
-1

ここでは、書き込みアクセス違反をキャッチしようとしましたが、動作しません。私はいくつかの方法を試しましたが、誰も私のために働いていません。どのように動くべきか説明してください。あなたが違法な何かをするとき書き込みアクセス例外のキャッチが機能しない

int main(){ 
    int *pint = new int(); 

    delete pint; 

    try 
    { 
     *pint = 100; 
    } 
    catch (...) 
    { 
     cout << "this is the one " << endl; 
    } 
} 
+5

この「使用は自由の後で "未定義の行動を爆発させる。 C++例外がスローされることはありません。したがって、捕まえることはありません。 – VTT

+0

C++には "書き込みアクセス例外"はありません。 –

+2

頭の中で自分を撃って生き残るための唯一の方法は、まず頭の中で撃たれないことです。弾丸が頭蓋を貫通して反対側に出ると、それは不可逆的に十分な神経物質を崩壊させ、それを使用可能な状態に復元することができなくなるためです。したがって、あなたは頭に撃たれてはいけません。 – Mysticial

答えて

0

C++は実行時例外をスローしません(読み:未定義の動作を使用し、何かを)。それはJavaのものです。 C++では、それは起こりません。

*pint = 100;と書くと、自分が所有していないメモリに100を割り当てている可能性があります.1つは、所有していないメモリにアクセスしたため、カーネルがアプリケーションにSIGSEGVを送信し、 。しかし、その信号を捕まえる方法はありますので、それを使うこともできますが、それはお勧めできません。

しかし、何も例外がスローされないので、try-catchは使用できません。プログラムは継続して実行することもできますが、あなたはただの保証はありません。

+0

ありがとうございました。これをどう扱うかについて教えてください。どのように私はそのような状況をキャッチすることができます私はWindows上でプログラミングしています – Hara

+0

@Hara Windows SDKの一部として利用可能な 'Application Verifier'を使うべきです、それはメモリ使用問題の多くの種類をキャッチすることができます。 – VTT

+0

@ user2079303 True、fixed。ありがとう:) – Rakete1111

1

メモリアクセス違反には未定義の動作があるため、スローするように指定されていません。投げられなかったものを捕まえることは不可能です。

メモリ違反(または未定義の動作をしている何か他のもの)は、標準C++内に発生しているかどうかを検出する方法はありません - あなたのプログラムをデバッグするために使用することができ、外部ツールがありますが:http://valgrind.org/

関連する問題