プログラムが閉じられると、割り当てられた新しいメモリは常に解放されますか? (バグ/エラーなど、またはカスタムクローズ機能から予期せず閉じた場合でも)?
または、メインから戻った場合にのみメモリを解放しますか?
はい、オペレーティングシステムは通常、各プロセスによって割り当てられたメモリを追跡し、それらのプロセスが終了すると解放します-方法は関係ありません。
ただし、これは一般に、プログラムでメモリリークが発生する正当な理由ではありません。プログラムは、取得したリソース (メモリを含む) を常に積極的に解放する必要があります。
正当な理由としては、プログラムの正確性がグローバル/シングルトン オブジェクトの破棄順序に依存していること、または割り当てられたメモリを終了前に積極的に解放することのコストが高いことが考えられます。
ただし、プログラマーが意図的にメモリの解放を避ける理由があることは認めますが、自分でクリーニングしないための「正当な理由」と見なされるものについて、浅はかな考え方を持たないように注意してください。
取得したメモリを解放するコードを書くことに慣れ、この方法に従わないすべての状況を非常に明確な形式で明示的に文書化することをお勧めします。繰り返しますが、これを必要とするまれなケースがあるかもしれませんが、獲得したメモリを解放するかどうかは、常にプログラマーの積極的かつ意図的な決定でなければなりません。
注:コメントからSteve Jessopを引用すると、メモリを積極的に解放したくないもう1つの正当な理由は、プログラムが何らかの形で予期しない状態に達したために終了する必要がある場合です-おそらく不変条件または前提条件に違反するもの特定の機能。通常、前提条件に違反することはUndefined Behaviorを意味します。
定義上、UB から正常に回復する方法はないため、非常に望ましくない結果を含む結果をもたらす可能性のあるアクションをさらに実行するのではなく、プログラムをすぐに終了することをお勧めします。
すべてのオペレーティング システム (最新の OS ではこれは問題ではありません) がこの操作を行うわけではなく、このプロパティに依存しない方がよいでしょう。ここで見ることができます: malloc 後に解放しないと本当に何が起こるのですか?