Ale*_*lex 8 c++ memory-leaks shared-ptr googlemock
对于这种特殊情况,我无法摆脱泄漏.
执行测试时,我收到了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()));
}
}
Run Code Online (Sandbox Code Playgroud)
我已经找到 为什么GoogleMock泄漏了我的shared_ptr?
在Stack-Overflow,这是相关的.但是那里的建议并没有解决我的问题:X
为了至少抑制错误,我发现的唯一可能性是:
Mock::AllowLeak(deviceElement_.get());
Run Code Online (Sandbox Code Playgroud)
然而,这不是一个非常干净的解决方案=)
那么如何正确摆脱泄漏呢?
如果你使用智能指针,你仍然需要有一个清晰的所有权概念,否则你可能会得到糟糕的性能、循环依赖和内存泄漏。
我建议智能指针的默认选择应该是unique_ptr
唯一所有权并为观察者使用原始指针。
如果观察者有可能比所有者活得更久,那么就转向shared_ptr
为所有者和weak_ptr
观察者服务的一种。
shared_ptr
仅当您没有明确的所有者并小心循环依赖时,才使用“共享”作为最后的手段。