_CrtMemCheckpoint
Win32 /_CrtMemDifference
メソッドを使用して、テスト対象のコードのメモリ リークを検出する単体テストがいくつかあります。x64 マシン (Windows 7) では、これらのテストの一部で、x86 (32 ビット) マシンでは報告されないメモリ リークが報告されます。これらの x64 マシンで、VS2008 または VS2012 のいずれかで次のコードをコンパイルし、Boost 1.52.0 を使用すると、「メモリ リークが検出されました!」という結果になります。
#include <boost/filesystem.hpp>
#include <crtdbg.h>
int main(int argc, char **argv)
{
_CrtMemState state1, state2, state3;
_CrtMemCheckpoint(&state1);
{
boost::filesystem::path remoteDirPath("c:/");
}
_CrtMemCheckpoint(&state2);
int res = _CrtMemDifference( &state3, &state1, &state2);
if (res != 0)
{
_CrtDumpMemoryLeaks();
std::cout << "Memory leak detected!";
}
}
これは実際には boost::filesystem::path のメモリ リークですか? ライブラリの初期化か何かだと思います。
int main(int argc, char **argv)
{
{
boost::filesystem::path initDummy("c:/");
}
_CrtMemState state1, state2, state3;
_CrtMemCheckpoint(&state1);
{
boost::filesystem::path remoteDirPath("c:/");
}
_CrtMemCheckpoint(&state2);
int res = _CrtMemDifference( &state3, &state1, &state2);
if (res != 0)
{
_CrtDumpMemoryLeaks();
std::cout << "Memory leak detected!";
}
}
「メモリリークが検出されました!」を出力しません。
私の質問は次のとおりです。単体テストでこのような問題を回避するにはどうすればよいですか? テストを開始する前にそのような変数を初期化することは解決策ですか? 他のコードを使用する場合、そのようなことをさらに多く行う必要がありますか? それとも、一般的にそのようなテストを行うのは悪い考えですか?
ご感想ありがとうございます!