重複の可能性:
C++ でメモリ リークをチェックする最良の方法は何ですか?
プログラムの終了後にメモリリークをチェックする方法と、割り当てられたがまだ解放されていないメモリ領域があるかどうかをチェックする方法はありますか?
例えば:
int main()
{
int *iPtr = new int;
// Was allocated memory that is not released yet?
return 0;
// Memory leaks?
}
重複の可能性:
C++ でメモリ リークをチェックする最良の方法は何ですか?
プログラムの終了後にメモリリークをチェックする方法と、割り当てられたがまだ解放されていないメモリ領域があるかどうかをチェックする方法はありますか?
例えば:
int main()
{
int *iPtr = new int;
// Was allocated memory that is not released yet?
return 0;
// Memory leaks?
}
Linux ではvalgrindを使用できます。Windows では、割り当てプロファイラー ( PurifyとAQTime 7があります) を検索するか、_CrtDumpMemoryLeaks を使用するか(msvc 固有で、誤検知が発生する可能性があります)、グローバル演算子 new/delete をオーバーライドしてメモリ使用量を報告するカスタム メモリ マネージャーを作成する必要があります。
割り当てられたすべてのメモリが解放されたことを確認することは、メモリ リークとの戦いの一部にすぎません。
プログラムが毎秒 1 メガバイトのメモリをプログラムの操作中に割り当て、この割り当てられたメモリのすべてがプログラムの終了直前に解放されるとします。割り当てられたすべてのメモリは最終的に解放されるため、厳密に言えば、これはリークではありません。実際には、プログラムが長時間実行されることが予想される場合、これは巨大なリークの影響を及ぼします。
プログラムを書き直して、1 秒あたりのそのメガバイトのほんのわずかな部分を除いてすべてをオンザフライで解放し、残りの割り当てられたメモリの小さなドレッジがプログラムの終了時に再び解放されるとします。厳密に言えば、まだリークではありませんが、このプログラムは元のバージョンよりも確実に動作が改善されています。まだ小さな実行時リークがあるため、プログラムを数週間実行すると問題が発生する可能性があります。
ここで、プログラムを書き直して、メモリ消費量が合理的な制限によって永久に制限されるとします。この実行時の制限は、割り当てられたすべてのメモリを終了時間までに解放することよりも、おそらくより重要な機能です。この実行時の有界性を証明するのは困難です。プログラムが終了するまでに割り当てられたすべてのメモリが解放されることをテストするのは、はるかに簡単な作業です。商用ツールは、リーク チェックのために後者に焦点を当てる傾向があります。
Valgrindを使用してみてください。
Visual C++ の場合、Visual Link Detector が適切なオプションになる場合があります。
私の知る限り、ユーザー空間で作業していてプロセスが終了すると、そのプロセスによって割り当てられたすべてのメモリが解放され、オペレーティング システムに返されます。(メモリをプールに戻すためにプロセスを実行しているのはOS自体です;))
したがって、チェックするものは何もありません。カーネル空間でタスクを実行している場合は話が異なりますが、使用しているオペレーティング システムによってシナリオが異なる可能性があります。