8

对于这种特殊情况,我无法摆脱泄漏。

执行测试时,我收到 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()));
        }
}

我已经找到了 为什么 GoogleMock 会泄露我的 shared_ptr?

在 Stack-Overflow,这是相关的。但是那里的建议并不能解决我的问题:X

为了至少抑制错误,我发现的唯一可能性是:

Mock::AllowLeak(deviceElement_.get());

然而,这不是一个非常干净的解决方案 =)

那么如何正确的去除漏水呢?

4

3 回答 3

3

如果您使用智能指针,您仍然需要对所有权有一个清晰的概念,否则您可能会获得较差的性能、循环依赖和内存泄漏。

我建议智能指针的默认选择应该是unique_ptr唯一的所有权,并为观察者使用原始指针。

如果观察者可能比所有者长寿,那么shared_ptr为所有者和weak_ptr观察者移动到一个。

shared_ptr仅当您没有明确的所有者并注意循环依赖时,才将“共享”用作最后的手段。

于 2014-10-25T07:08:32.190 回答
2

不要使用共享指针。或者,如果您真的必须使用它们,请确保它们回到 0 并在测试结束时被销毁。

于 2013-11-27T21:51:20.030 回答
2

这是一个老问题,但我没有看到有人提到我刚刚找到的解决方案。

在我向我正在模拟的类中添加一个虚拟析构函数之前,我看到了同样的错误。在您的情况下,请确保您在 ParserElementFactoryMock 上有一个虚拟析构函数。有道理,因为没有虚拟析构函数,模拟对象在超出范围时不会释放它们的资源。

于 2016-03-08T23:15:10.220 回答