You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级GTest至1.12.x后GMock因未预期调用出现内存泄漏

GTest 1.8.x 升级到 1.12.x 后触发未预期Mock调用时的内存泄漏问题

将GTest框架从1.8.x版本升级至1.12.x后,部分测试结束时会报告内存泄漏。已简化测试环境编写复现代码,该代码在旧版本下无泄漏,新版本出现泄漏,触发条件为调用Mock对象上未显式添加EXPECT_CALL的函数。取消注释预期语句后泄漏消失,调整Mock对象的存储方式(静态shared_ptr、类成员、栈变量)均无法解决问题。经排查,泄漏源于gmock-spec-builders.cc中UninterestingCallReactionMap()内的unordered_map实例化。

复现代码

using namespace testing;

class IFoo
{
public:

    IFoo() = default;
    virtual ~IFoo() = default;

    virtual bool closeLink(void) = 0;
};

class MockFoo : public IFoo
{
public:
    MOCK_METHOD0(closeLink, bool());
};

class MemLeakReproTest : public Test
{
};

TEST_F(MemLeakReproTest, TestStuff)
{
    MockFoo mockFoo;

    //EXPECT_CALL(mockFoo, closeLink()).Times(1).WillOnce(Return(true));
    mockFoo.closeLink();
}

补充疑问

以下是Windows测试项目main.cpp中的泄漏检测代码,请问该配置是否正确?

{
 // Enable leak checking on exit
 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
 // Write CRT warnings to stderr
 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);

 wchar_t filename[MAX_PATH] = {};
 wcscpy_s(filename, *wargv);
 wcscat_s(filename, L".memleaks");

 hLogFile = CreateFile(filename, GENERIC_WRITE,
     FILE_SHARE_READ, NULL, CREATE_ALWAYS,
     FILE_ATTRIBUTE_NORMAL, NULL);

 _CrtSetReportHook(reportHook);

 _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);

 testing::InitGoogleTest(&argc, argv);
 int result = RUN_ALL_TESTS();

 LocalFree(wargv);

 return result;
}

内容的提问来源于stack exchange,提问作者Pete Roberts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:09:56