我们有几个单元测试使用 Win32 _CrtMemCheckpoint
/_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!";
}
}
不输出“检测到内存泄漏!”。
我的问题是:如何避免单元测试出现此类问题?在开始测试之前初始化这样一个变量是一个解决方案吗?使用其他代码时,我是否需要做更多这样的事情?还是一般来说做这样的测试是个坏主意?
谢谢你的想法!