3

メモリを割り当てるプログラムがあり、数行後にassertステートメントがあるとします。assertステートメントがスローされてエラーが発生した場合、割り当てられたメモリはどうなりますか? プログラムを停止する前に解放されますか?

4

2 に答える 2

8

assert失敗すると、エラーをstderrに書き込み、abort()を呼び出します。exit()とは異なり、 atexit()に登録されている関数を実行したり、デストラクタを呼び出したりすることはありません。

したがって、デストラクタ、クリーンアップコードなどを呼び出すことはできません。したがって、メモリはプログラムによって解放されないため、「予期しない」終了の前に、OSに依存します。


デストラクタを呼び出すとさらにエラーが発生する可能性があるため、これはおそらく設計によるものです。失敗したassertで終了し、それ以上のコードは実行されません。

于 2012-11-09T07:42:39.923 に答える
4

assert障害によってプログラムがダウンしても、メモリは割り当てられたままになります。

プロセスを破棄する一環として、最新のデスクトップ OS はメモリを再利用します。一部の組み込みオペレーティング システムではこれができない可能性がありますが、その名前は手元にありません。

Valgrind などのユーティリティを使用して、この方法で OS によって再利用する必要があるメモリを検出できます。

于 2012-11-09T07:38:54.567 に答える