如何使用weak_ptr构造一个对象,该对象保存对父项的引用

How do I construct an object that holds a reference to a parent using a weak_ptr?

本文关键字:保存 对象 引用 weak 何使用 ptr 一个对象      更新时间:2023-10-16

>假设我有一个对象,其中包含对子对象的shared_ptr。

我希望子对象具有父对象的weak_ptr,子对象的构造函数应该是什么样子,我应该如何从父对象构造子对象?

提前致谢

由于您拥有子对象的唯一所有者身份,因此可以保证子对象的寿命不会超过其父对象。你可以有一个这样的模型。

struct Parent;
struct Child {
        Child( Parent& p ) : p_(&p) {}
        Parent* p_;
};
#include <memory>
struct Parent {
        std::unique_ptr<Child> c_;
        void AddChild() {
                c_.reset(new Child(*this));
        }
};

当然,子级应该小心它在析构函数中对父级所做的任何事情,它可能会被销毁,因为它的父级超出了范围。这是关于子项对其父级weak_ptr的唯一优势(它仍然无法从其析构函数对父级执行任何操作,但至少它可以安全地判断这一点(,但这依赖于其父级由shared_ptr拥有,这对子项来说是一个更加不灵活的设计。

这将是weak_ptr解决方案:

// NOT RECOMMENDED
#include <memory>
struct Parent;
struct Child {
        Child( const std::shared_ptr<Parent>& p ) : p_(p) {}
        std::weak_ptr<Parent> p_;
};
struct Parent : std::enable_shared_from_this<Parent> {
        std::unique_ptr<Child> c_;
        void AddChild() {
                // Warning, undefined behaviour if this Parent
                // isn't owner by shared_ptr
                c_.reset(new Child(shared_from_this()));
        }
};