Cのデストラクタのようなメカニズムはありますか? または、それを達成する別の方法はありますか?
私の要件は、プログラムが終了すると、実行時に割り当てられたすべてのメモリを解放する必要があるということです。を使用して割り当てられたメモリのリストを保持していmalloc
ます。
Cのデストラクタのようなメカニズムはありますか? または、それを達成する別の方法はありますか?
私の要件は、プログラムが終了すると、実行時に割り当てられたすべてのメモリを解放する必要があるということです。を使用して割り当てられたメモリのリストを保持していmalloc
ます。
もう 1 つの方法は、メモリ マネージャーを作成することです。
アイデアは、メモリ マネージャがメモリの大きなブロックを割り当て、それをプログラムの残りの部分が使用できるように小さな断片に分割するというものです。プログラムが終了すると、メモリ マネージャーは大きなブロックを削除するだけです。
これが基本的な考え方ですが、プログラムのメモリ使用プロファイルによっては、メモリ マネージャをより複雑にする必要がある場合があります。
調べることができる Doom ソース コードには基本的なメモリ マネージャーがあります: http://doom.wikia.com/wiki/Zone_memory
非常に簡単な解決策は、 を使用しないことmalloc
です。これは、一部の安全性が重要なシステムで採用されているオプションであり、スタックを使用するだけです。
それ以外の場合は、制御方法でプログラムを終了し、終了時に整理します。
C++ はリソースの有効期間を管理するために RAII を使用します。
構造体のメンバー関数を持つことができないため、C にはそのようなメカニズムはありません。あなたの主な関心事は、寿命の終わりではなく、プログラムの寿命中に再利用するためにメモリ割り当てを解放することです。プログラムが終了すると、OS はとにかくリークしたメモリを回収します。
C でこれを行う最善の方法は、ライフタイムを処理し、それに応じてコーディングするようにアプリケーションを設計することです。これには、動的メモリ割り当てが本当に必要かどうか、割り当てられたオブジェクトの有効期間を明確に定義する必要があるかどうかを慎重に決定することが含まれます。
オペレーティングシステムがこれを処理します。プログラムが終了すると、OS はプロセスによって使用されたすべてのメモリを解放します。
アプリケーションがある種のゾンビ プロセスにならない限り、アプリケーションの終了時に、malloc() によって割り当てられたすべてのメモリが解放されます。それ以外の場合は、通常の終了ですべてのスペースが解放されます。
malloc() 関数は、オペレーティング システム コールを使用してメモリを割り当てます。プロセスが終了すると、プロセスに割り当てられたメモリはオペレーティング システムによって回収されます。
Windows でゾンビ プロセスが発生し、プロセスがタスク マネージャー アプリケーションによって終了されるまでメモリ内にとどまるケースを見てきました。