gpt4 book ai didi

c++ - 为什么 Google Test/Mock 通过 std::unique_ptr 显示泄露的模拟对象错误?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:55 25 4
gpt4 key购买 nike

假设有一个 Bar 对象,它使用了一个 Foo 对象。所有权是独占的,因此 Bar 在其构造函数中将 Foo 作为 std::unique_ptr 获取。我想用 Google 测试框架测试 Bar,所以我编写了以下代码:

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 但它没有看到这里不必删除,因为它已经被移动了。测试是安全的,因为对象本身是相同的,只是所有权发生了变化(这是我的意图)。

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

最佳答案

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

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

参见 When to use virtual destructors?如果一个基类 Foo有虚函数,它应该有一个虚拟析构函数或一个非公共(public)析构函数。

关于c++ - 为什么 Google Test/Mock 通过 std::unique_ptr 显示泄露的模拟对象错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50495559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com