【问题标题】:std::make_shared<Type> creates memory leakstd::make_shared<Type> 创建内存泄漏
【发布时间】:2018-11-28 09:02:55
【问题描述】:

当我使用 std::make_shared 时,Valgrind 给了我一些内存泄漏:

TEST_F(CTestChild, add_gran_child) {
    auto child{ std::make_shared<CChild>(TType::Home, std::make_shared<CMockParent>()) };
    NiceMock<CMockCaller> caller;
    auto gran_child( std::make_shared<CMockGranChild>(TType::Girl, child, caller) );
    child->Add(gran_child);
    EXPECT_EQ(child->GetCount(), 1);
}

class CMockParent : CParent{
public:
    void something(void) override {}
}

class CParent{
public:
    virtual void something(void) = 0;
}

class CChild{
public:
    CChild(TType, shared_ptr<CParent> a) : _parent(a) {}
    void Add(shared_ptr<CGranChild> a) { _list.push_back(a) }
    shared_ptr<CParent> _parent;
    TList<shared_ptr<CGranChild>> _list;
}

class CGranChild{
public:
    CGranChild(TType, shared_ptr<CChild> a) : i_parent(a) {}
    shared_ptr<CChild> _parent;
}

为什么 make_shared 会导致内存泄漏?

编辑:为了更好地理解代码,我已经包含了类的摘要。

【问题讨论】:

  • 子节点是否将 shared_ptr 存储到其父节点,反之亦然?
  • 是的,我正在添加类概述,以便更清晰

标签: c++ c++11 std smart-pointers


【解决方案1】:

您有 2 个共享指针彼此拥有。

想一个清晰的所有权概念。然后在非所有者中存储std::weak_ptr。访问非拥有对象.lock()weak_ptr 并在使用前检查生成的shared_ptr。

【讨论】:

  • ...或者甚至使用原始指针而不是 weak_ptr,如果您可以保证拥有的对象总是比非拥有的对象寿命长。
  • 我更喜欢weak_ptr
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多