2011-09-17 14 views
2

メモリの割り当てが成功しなかった場合、例外を投げたり処理したりできることを学んだだけです。しかし、ここでは、newoperatorを使用すると、多くの人が例外を処理することはありません。メモリの割り当て時の例外

たとえば、次のような場合、プログラムのどの時点でも失敗しないでしょうか?

char* c = new char[1000]; 
delete []c; 

例外がある場合、どのように処理する必要がありますか?

答えて

2

ほとんどの人がbad_alloc例外を明示的に処理しない理由は、多くの場合、ほとんどのユーザーアプリケーションがメモリ不足状態から回復するために多くの時間を費やすことができないためです。する。実行できる合理的なリカバリー・アクションがある場合にのみ、明示的に例外をキャッチする必要があります。

たとえば、大きなメモリブロックの割り当てに失敗した場合にプログラムが別の方法を試みる場合など、std::bad_allocの例外をキャッチすることは意味があります。これは、一部のシステムでのみ適用されます。メモリをオーバーコミットするシステムでは、大きなブロックのメモリを投機的に割り当てて、std::bad_allocを期待すると失敗します。

クリーンアップを行うために明示的にbad_allocをキャッチすることは、デストラクタで正しいクリーンアップを行うRAII形式のクラスの適切なインスタンスによってリソースが管理されていないことを示すものです何らかの例外によって、または他の何らかの方法で残されている。

3

新しいあなたは、のtry-catchブロックを使って、それをキャッチする必要があり、例外std::bad_allocをスロー:

try 
{ 
    char* c = new char[1000]; 
} 
catch(std::bad_alloc &except) 
{ 

} 

私は例外を除いて従う基本的なガイドラインは次のとおりです。
は、ときに例外をハンドル例外から回復することができれば、適切な診断をログに記録してアプリケーション/プログラムを終了できない場合は、例外から回復するために必要なアクションを実行します。

メモリ割り当てに失敗した場合、アプリケーション/プログラムは通常は続行または回復できません。そのため、診断メッセージを記録したり、例外を上向きに伝播させてクラッシュさせたりして終了してください。