为何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
相关产品推荐
相关产品推荐

