今更知ったのですが、Visual Studioではcrtdbg.hをインクルードして
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
をmainが始まったところに書いておくとメモリの解放し忘れを検知してデバッグ出力で知らせてくれるようです。これでほとんどのメモリリークを見つけられるようです。
今まで頑張ってコードと見詰め合っていた自分がアホみたいです。
以下にサンプルプログラムを示します。
#include <crtdbg.h>
class TestClass
{
public:
TestClass(){ m_data=new int[10]; }
~TestClass(){}
private:
int *m_data;
};
void Test1()
{
int *data = new int[3];
}
void Test2()
{
TestClass data;
}
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
Test1();
Test2();
return 0;
}
デバッグ出力の最後の方には次のように表示されます。
Detected memory leaks!
Dumping objects ->
{63} normal block at 0x008E4BC0, 40 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{62} normal block at 0x008E4B78, 12 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.