標準のユーティリティを使用して、アプリケーションのメモリリークを見つけたい。以前は自分のメモリアロケータを使用していましたが、他の人(そう、AlienFluid)がMicrosoftのApplication Verifierの使用を提案しましたが、リークを報告することができないようです。私は次の簡単なアプリケーションを持っています:
#include <iostream>
#include <conio.h>
class X
{
public:
X::X() : m_value(123) {}
private:
int m_value;
};
void main()
{
X *p1 = 0;
X *p2 = 0;
X *p3 = 0;
p1 = new X();
p2 = new X();
p3 = new X();
delete p1;
delete p3;
}
このテストには明らかにメモリリークが含まれています。p2は新規ですが削除されていません。
次のコマンドラインを使用して実行可能ファイルをビルドします。
cl /c /EHsc /Zi /Od /MDd test.cpp
link /debug test.obj
Application Verifier(4.0.0665)をダウンロードし、すべてのチェックを有効にしました。
テストアプリケーションを実行すると、Application Verifierでそのログを確認できますが、メモリリークは発生しません。
質問:
- Application Verifierがリークを報告しないのはなぜですか?
- それとも、Application Verifierは本当にリークを見つけることを目的としていませんか?
- アプリケーションの最後にリークを明確に報告するために利用できる他のツールがない場合(つまり、1 GB以上のアプリケーションでは不可能であるため、定期的なスナップショットを作成して比較することはできません)。割り当て場所(CRTの最後の単純なリークレポートではありません)
適切なユーティリティが見つからない場合でも、自分のメモリマネージャに依存する必要があります(これは完全に機能します)。