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

为何Google Test/Mock使用std::unique_ptr时提示模拟对象泄漏错误?

你的假设其实是错的——Google Test并没有误判,你的代码确实存在mock对象未被正确销毁的问题,根源出在基类Foo缺少虚析构函数。

问题原因详解

C++中,当通过基类指针/智能指针销毁派生类对象时,如果基类的析构函数不是虚函数,会触发未定义行为,实际表现就是派生类的析构函数完全不会被执行。对应到你的代码:

  • Bar持有std::unique_ptr<Foo>,实际指向MockFoo实例
  • 测试函数结束时,Bar作为局部变量被销毁,unique_ptr<Foo>会调用Foo的析构函数,但因为Foo的析构不是虚函数,MockFoo的析构函数根本不会执行

而Google Test的mock对象是通过自身的析构函数向框架报告「我已被销毁」的。既然MockFoo的析构没被调用,GTest就会认为这个mock对象一直存活到程序结束,自然会报「泄漏」错误。

修复方案

只需要给Foo类添加一个虚析构函数即可:

class Foo {
public:
    virtual int F() = 0;
    virtual ~Foo() = default; // 新增虚析构函数
};

添加之后,std::unique_ptr<Foo>销毁时会正确调用MockFoo的析构函数,GTest会收到mock已销毁的通知,泄漏提示就会消失。

补充说明:如果未来你遇到确实需要转移mock所有权(且基类析构逻辑正常)的场景,可以用testing::Mock::Release(mock_ptr)让GTest停止跟踪该mock对象,但这个场景下完全不需要——解决虚析构的问题就足够了。

内容的提问来源于stack exchange,提问作者Tibor Takács

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:57:13