为什么Google Test / Mock显示std :: unique_ptr泄漏的模拟对象错误?

Tib*_*ács 4 c++ googletest googlemock c++11

假设存在Bar使用Foo对象的对象。所有权是独占的,因此Bar得到Foo一个std::unique_ptr在其构造。我想Bar使用Google Test框架进行测试,因此我编写了以下代码:

using namespace testing;

class Foo
{
  public:
    virtual int F() = 0;
};

class Bar
{
  public:
    Bar(std::unique_ptr<Foo>&& foo) : m_foo(std::move(foo))
    {
    }

    int B()
    {
        return m_foo->F();
    }

  private:
    std::unique_ptr<Foo> m_foo;
};

class MockFoo : public Foo
{
  public:
    MOCK_METHOD0(F, int());
};

class BarTest : public Test
{
};

TEST_F(BarTest, Test1)
{
    auto mock_foo = std::make_unique<MockFoo>();
    ON_CALL(*mock_foo, F()).WillByDefault(Return(1));

    Bar bar(std::move(mock_foo));

    auto val = bar.B();

    EXPECT_THAT(val, 1);
}
Run Code Online (Sandbox Code Playgroud)

测试运行良好,但出现以下错误:

... test.cpp:293:错误:应删除此模拟对象(在测试BarTest.Test1中使用),但绝对不要删除。它的地址是@ 0x1c7c590。错误:在程序出口发现1个泄漏的模拟对象。

我认为Google Test认为我还没有销毁mock_foo它,但是没有看到它没有被删除,因为它已经被移动了。测试是安全的,因为对象本身是相同的,只是所有权已更改(这是我的意图)。

我的假设正确吗?如果是,我如何抑制此错误消息?我不,内存泄漏在哪里?

Jus*_*tin 6

问题是Foo没有虚拟析构函数。std::unique_ptr<Foo>因此,将不会调用派生类的析构函数,而只会调用的析Foo构函数。

class Foo
{
  public:
    virtual ~Foo() = default;
    virtual int F() = 0;
};
Run Code Online (Sandbox Code Playgroud)

请参阅何时使用虚拟析构函数?如果基类Foo具有虚拟功能,则它应该具有虚拟析构函数或非公共析构函数。