Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Googletest中识别内存泄漏源_C++_Windows_Visual Studio 2012_Memory Leaks_Googletest - Fatal编程技术网

C++ 在Googletest中识别内存泄漏源

C++ 在Googletest中识别内存泄漏源,c++,windows,visual-studio-2012,memory-leaks,googletest,C++,Windows,Visual Studio 2012,Memory Leaks,Googletest,我在Windows 7中使用GestEnter 1.7对VisualStudio 2012中的C++代码进行单元测试。 我已经扩展了GTest,尝试使用\u CrtMem…方法进行简单的内存泄漏测试。(来源:) 在大多数情况下,这一切都很好!然而,我目前有一个44字节内存泄漏的报告,我相信这可能是一个误报,但我无法确定如何识别它 我必须扩展GTest的代码是: // -----------------------------------------------------------------

我在Windows 7中使用GestEnter 1.7对VisualStudio 2012中的C++代码进行单元测试。

我已经扩展了GTest,尝试使用
\u CrtMem…
方法进行简单的内存泄漏测试。(来源:)

在大多数情况下,这一切都很好!然而,我目前有一个44字节内存泄漏的报告,我相信这可能是一个误报,但我无法确定如何识别它

我必须扩展GTest的代码是:

// ------------------------------------------------------------------------------------------------
#include <gtest/gtest.h>
// ------------------------------------------------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
// ------------------------------------------------------------------------------------------------
namespace testing
{
    class MemoryLeakDetector : public EmptyTestEventListener
    {
#ifdef _DEBUG
    public:
        virtual void OnTestStart(const TestInfo&)
        {
            _CrtMemCheckpoint(&memState_);
        }

        virtual void OnTestEnd(const TestInfo& test_info)
        {
            if(test_info.result()->Passed())
            {
                _CrtMemState stateNow, stateDiff;
                _CrtMemCheckpoint(&stateNow);
                int diffResult = _CrtMemDifference(&stateDiff, &memState_, &stateNow);
                if (diffResult)
                {
                    FAIL() << "Memory leak of " << stateDiff.lSizes[1] << " byte(s) detected.";
                }
            }
        }

    private:
        _CrtMemState memState_;
#endif // _DEBUG
    };
}
// ------------------------------------------------------------------------------------------------
int main(int argc, char **argv) 
{
    ::testing::InitGoogleTest(&argc, argv);
    testing::UnitTest::GetInstance()->listeners().Append(new testing::MemoryLeakDetector());

    RUN_ALL_TESTS();

    system("pause");
    return 0;
}
// ------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------
#包括
// ------------------------------------------------------------------------------------------------
#定义\u CRT\u安全\u无\u警告
#定义\u CRTDBG\u映射\u ALLOC
#包括
// ------------------------------------------------------------------------------------------------
命名空间测试
{
类MemoryLeakDetector:公共EmptyTeventListener
{
#ifdef_调试
公众:
虚拟void OnTestStart(const TestInfo&)
{
_CrtMemCheckpoint(&memState));
}
虚拟void OnTestEnd(常量测试信息和测试信息)
{
如果(测试信息结果()->通过())
{
_CrtMemState stateNow、stateDiff;
_CrtMemCheckpoint(&stateNow);
int衍射结果=_CrtMemDifference(&stateDiff,&memState,&stateNow);
if(衍射结果)
{

如果正在运行多个线程或访问全局变量(并分配了堆),则为FAIL()检查点之间可能存在误报。请注意。在所讨论的情况下,我实际上启动了一个线程,然后停止并删除它。理论上,这应该已经清除了所有内容。我已经将内容缩小到std::deque,但我99.9%确定应该正确处理它。如果可以的话“查看”明显泄漏的内存if将确认/否认我的假设。sizeof(testing::MemoryLeakDetector)=56并且没有全局变量/静态。如果多个线程正在运行或全局变量被访问(并分配了堆)在检查点之间可能会出现误报。请注意这一点。在这种情况下,我实际上启动了一个线程,然后停止并删除它。理论上,这应该已经清除了所有内容。我已经将内容缩小到std::deque,但我99.9%确信它应该得到正确处理。如果可以的话”请参阅“显然已泄漏的内存将确认/否认我的假设。sizeof(testing::MemoryLeakDetector)=56且无全局变量/静态。