実際、あなたの質問が本当に「私はこの簡単なプログラムを持っています。終了する前に数バイトを解放しなくても大丈夫ですか?」答えはイエスです。最新のオペレーティング システムであれば、問題なく動作します。そして、プログラムは簡単です。これをペースメーカーに入れたり、トヨタ カムリのブレーキ システムを動かしたりするようなものではありません。唯一の顧客があなたである場合、ずさんなことによって影響を受ける可能性があるのはあなただけです。
些細なケースについて尋ねられたこの質問への回答から、自明でないケースに一般化し始めると、問題が発生します。
それでは、重要なケースについて 2 つの質問をしてみましょう。
複雑な方法でメモリの割り当てと割り当て解除を行う長時間実行サービスがあり、複数のアロケータが複数のヒープにヒットする可能性があります。通常モードでのサービスのシャットダウンは、外部状態 (ファイル、データベースなど) が一貫してシャットダウンされるようにすることを含む、複雑で時間のかかるプロセスです。シャットダウンする前に、割り当てたメモリのすべてのバイトが割り当て解除されていることを確認する必要がありますか?
はい、その理由を説明します。実行時間の長いサービスで起こりうる最悪の事態の 1 つは、誤ってメモリ リークが発生した場合です。小さな漏れでも、時間の経過とともに大きな漏れになる可能性があります。メモリ リークを見つけて修正するための標準的な手法は、アロケーション ヒープを計測して、シャットダウン時に解放されることなく割り当てられたすべてのリソースをログに記録することです。多くの誤検知を追跡し、デバッガーで多くの時間を費やすのが好きでない限り、厳密に言えば必要でなくても、常にメモリを解放してください。
ユーザーは、サービスのシャットダウンに数十億ナノ秒かかる可能性があることをすでに予想しているため、仮想アロケーターに余分な圧力をかけて、すべてがクリーンアップされていることを確認する必要がありますか? これは、大規模で複雑なソフトウェアに対して支払う対価にすぎません。また、常にサービスをシャットダウンしているわけではありません。繰り返しますが、実際よりも数ミリ秒遅くても誰が気にしますか?
私は同じ長期にわたるサービスを持っています。内部データ構造の 1 つが破損していることを検出した場合、「すばやく失敗」したいと考えています。プログラムは未定義の状態にあり、昇格された特権で実行されている可能性があります。破損した状態を検出した場合、それは私のサービスが敵対者によって活発に攻撃されているためであると想定します. 最も安全な方法は、すぐにサービスをシャットダウンすることです。サービスが稼働し続けてユーザーのデータをさらに危険にさらす危険を冒すよりも、攻撃者がクライアントへのサービスを拒否することを許可したいと思います。この緊急シャットダウンのシナリオでは、割り当てたメモリのすべてのバイトが解放されていることを確認する必要がありますか?
もちろん違います。オペレーティングシステムがそれを処理します。ヒープが破損している場合、攻撃者はエクスプロイトの一環としてメモリを解放することを望んでいる可能性があります。ミリ秒ごとにカウントされます。建物に戦術核兵器を投下する前に、わざわざドアノブを磨いたり、キッチンをモップで拭いたりする必要はありません。
それで、「プログラムが終了する前にメモリを解放する必要がありますか?」という質問に対する答えです。「それはあなたのプログラムが何をするかによって異なります」です。