Почему Google Test / Mock показывает ошибку утечки фиктивного объекта по std :: unique_ptr? - PullRequest
0 голосов
/ 23 мая 2018

Предположим, что существует объект Bar, который использует объект Foo.Владение является эксклюзивным, поэтому Bar получает Foo как std::unique_ptr в своем конструкторе.Я хотел бы протестировать Bar с помощью Google Test Framework, поэтому я сделал следующий код:

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);
}

Тест проходит успешно, но я получил следующую ошибку:

...test.cpp: 293: ОШИБКА: этот фиктивный объект (используемый в тесте BarTest.Test1) должен быть удален, но никогда не удаляется.Его адрес @ 0x1c7c590.ОШИБКА: обнаружен 1 пропущенный фиктивный объект при выходе из программы.

Я думаю, что Google Test считает, что я не уничтожил mock_foo, но не видит, что его не нужно удалять здесь, потому что он имеетбыл перемещен.Тест безопасен, потому что сам объект один и тот же, изменилось только право собственности (что и является моим намерением).

Верно ли мое предположение?Если да, как я могу подавить это сообщение об ошибке?Нет, где утечка памяти?

1 Ответ

0 голосов
/ 23 мая 2018

Проблема в том, что Foo не имеет виртуального деструктора.std::unique_ptr<Foo> поэтому не будет вызывать деструктор производного класса, просто деструктор Foo.

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

См. Когда использовать виртуальные деструкторы? Если базовый класс Foo имеет виртуальные функции, он должен иметь виртуальный деструктор или закрытый деструктор.

...