これは楽観的です。
ただし、大部分のリソースでは、プロセスの終了時に OS によってこれが自動的に処理される必要があります。
OS が自動的に処理するリソースは、「ファイル ハンドル」と「メモリ」だけです (これは OS によって異なる場合があります)。実際には、他のすべてのリソース (OS によって自動的に処理されるリソースのリストを誰かが持っている場合) は、OS によって手動で解放される必要があります。
最善の策は、terminate() を使用して終了することを避け、スタックを強制的に正しく巻き戻すことによって制御されたシャットダウンを試みることです。これにより、すべてのデストラクタが正しく呼び出され、リソースが (デストラクタを介して) 解放されるようになります。
私がする唯一のことは、問題をログに記録することです。そのため、それが起こったときに、戻ってコードを修正して、それが再び起こらないようにすることができます. 私は自分のコードがリソースの割り当てを解除するためにスタックをうまくアンワインドするのが好きですが、これは物事がうまくいかないときに突然停止するのが好きな人の意見です。
いつ終了するかの私のリストは次のとおりです。
一般に、例外処理メカニズムがスローされた例外のハンドラーを見つけられない場合に呼び出されます。具体的な例は次のとおりです。
- 例外は main() をエスケープします
- 注: ここでスタックが巻き戻されるかどうかは実装定義です。したがって、私は常にメインでキャッチしてから再スローします (明示的に処理しない場合)。そうすれば、(すべてのプラットフォームで) スタックの巻き戻しを保証しながら、OS の例外処理メカニズムの利点を引き続き得ることができます。
- 2 つの例外が同時に伝播します。
- 別の例外が伝播している間に、例外がデサトラクタをエスケープします。
- スローされる式は例外を生成します
- メインの前後の例外。
- 例外がグローバル オブジェクトのコンストラクター/デストラクターをエスケープする場合。
- 例外が関数の静的変数のデストラクタをエスケープする場合。(つまり、非ローカル静的オブジェクトのコンストラクター/デストラクターには注意してください)
- 例外は、atexit() で登録された関数をエスケープします。
- 現在伝播中の例外がない場合の再スロー。
- リストされていない例外は、例外指定子リストを持つメソッド/関数をエスケープします。