一部のクラスでは、内部にポインターを持つ静的な std::map があります。私の質問は、プログラムの最後に削除する必要があるかどうか、またはこのメモリが自動的に解放されるかどうかです。私の懸念は、 std::map が削除されたときに、内部に格納されているポインターがデストラクタを介して正しく削除されるかどうかです。
ありがとう。
マップにnew(またはnew []、またはmalloc)で割り当てられたポインターが含まれている場合、各ポインターには対応するdelete(またはdelete []、またはfree)が必要です。
マップのデストラクタは、ハゲのポインタをどうするかを知りません。ブーストスマートポインターのような適切な移動セマンティクスを持つスマートポインターの使用を検討してください。非常に新しいコンパイラーを使用している場合は、C++0xスマートポインターの1つを使用してください。ただし、STLコンテナ内で 現在の標準のstd::auto_ptrを使用しないでください。理由については、このスレッドを参照してください。
編集:
Billy ONealが指摘したように、boost::ptr_mapもこの目的のために正確に設計されています。
私が状況を正しく理解していれば、地図自体を削除することはありません。ただし、マップが指しているオブジェクトを削除する必要があるかもしれません。マップでは、ネイティブポインターの代わりに、Boostshared_ptrなどのスマートポインターを使用することをお勧めします。その後、オブジェクトは自動的にクリーンアップされます。
編集:Boostptr_mapを使用することはさらに良い考えかもしれません。
プロセスメモリ全体が解放されるという意味で、メモリは「自動的に解放」されますが、ポイントされたオブジェクトのデストラクタは呼び出されません。RAIIを使用している場合、これによりリソースリークが発生する可能性があります。
std::map
delete
メンバーを呼ぶことはありません。比較的最近のオペレーティングシステムを使用していると仮定すると、OSはプロセスの終了時にメンバーが占有しているメモリを再利用しますが、デストラクタは実行されません。
ポインタのマップがある場合、答えは「いいえ」です。デストラクタは呼び出されませんが、「はい」の場合、プロセスの実行の最後にメモリが解放されます。プロセスによって割り当てられたすべてのメモリは、プロセスが終了すると(クラッシュした場合でも)、オペレーティングシステムによって常に解放されますが、デストラクタが呼び出されない場合があります。
メモリ「リーク」とは、メモリが意図せずに一定期間削除されず、プロセスが継続するにつれてメモリが減少することです。めったに再起動されないサーバーなど、非常に長期間実行されるタイプのプロセスの場合、これは大きな問題になる可能性があります。
メモリ リーク検出器は、プログラミング呼び出しによって割り当てられ、削除されていないメモリを検出するため、valgrind などはこれをリークとして報告します。
コードを valgrind などのプログラムでチェックすることも同様に重要です。したがって、「邪魔になる」ものが少ないほど、実際のリークを見つけやすくなります。したがって、私のアドバイスは、new (または malloc または new[]) でポインターを割り当てたときに、システムにメモリやシングルトンなどをクリーンアップさせるだけではありません。
これを行うための「クリーンアップ」ルーチンを用意できます。マップ内のポインターをクリーンアップするデリータ (終了時に削除されるため) を持つマップのスコープ内にオブジェクトを配置するだけです。最初にオブジェクトを削除する必要があるため、マップよりも後で宣言する必要があります。
ポインタを格納するストレージクラスの場合と同様に、ポインタが指すメモリの割り当てを解除する必要があります。ストレージクラスは、自身のリソースをクリーンアップすることのみを担当します。プロセスの終了時にOSによるメモリの再利用に依存することは、悪い習慣です。