【发布时间】:2012-09-06 08:29:53
【问题描述】:
对于这种特殊情况,我无法摆脱泄漏。
我在执行测试时收到 Leaked Mock Objects 的消息。具体信息:
ClassElementFixture.h:102: 错误:这个模拟对象(用于测试 ClassElementFixture.initialize)应该被删除,但永远不会。它的地址是@0x940a650。
我标记了错误所指的行。 这是我的代码的简化版本:
...
class ClassElementFixture: public ::testing::Test
{
public:
boost::shared_ptr<fesa::ClassElement> classElement_;
boost::shared_ptr<fesa::DeviceElementMock> deviceElement_;
...
void SetUp()
{
classElement_.reset(new fesa::ClassElement());
}
void TearDown()
{
}
void initializeFake()
{
fesa::ParserElementFactoryMock factory;
deviceElement_.reset(new fesa::DeviceElementMock());
EXPECT_CALL(factory, createDeviceElement(_))
.WillOnce(Return(deviceElement1_));
EXPECT_CALL(*deviceElement_, initialize(_));//Error refers to here
classElement_->initialize(factory);
EXPECT_TRUE(Mock::VerifyAndClearExpectations(deviceElement_.get()));
}
}
我已经找到了 Why is GoogleMock leaking my shared_ptr?
在 Stack-Overflow,这是相关的。但是那里的建议并不能解决我的问题:X
为了至少抑制错误,我发现的唯一可能性是:
Mock::AllowLeak(deviceElement_.get());
然而这不是一个非常干净的解决方案 =)
那么如何正确地消除泄漏呢?
【问题讨论】:
-
我使用 google-mock v1.6.0 和 google-test v1.6.0
-
您是否尝试过重置()
TearDown()中的 shared_ptrs? -
你的 shared_ptr 关系中有循环吗?共享指针存在一个已知问题,循环会导致泄漏。
-
我刚看到你的 cmets ...抱歉我的回复时间长(我必须启用电子邮件通知)。自从我发布问题以来,使用的类的实现已经改变。所以我不能再重现这个错误了:X 我刚刚删除了所有的 Mock::AlowLeak,现在一切正常。我认为这确实可能是由循环依赖引起的......认为旧代码中使用了这样的......所以无论如何,感谢您的帮助!
标签: c++ memory-leaks shared-ptr googlemock