多个实例持有对 unique_ptr 的引用

Multiple instances holds a reference to a unique_ptr

我正在与时俱进,我想我应该开始一个新项目,目标是更多地使用和接触智能指针。我正在考虑使用 unique_ptr 的大型池来存储碰撞组件。这些组件将通过 const ref 传递给四叉树,四叉树在内部对 ptrs 执行只读操作。
我写了一个简化的例子来反映我的实施意图。

struct Owner
{
    unique_ptr<int> uPtr;
};

struct SomeContainer
{
    list<const unique_ptr<int>*> uPtrList;

    void Insert( const unique_ptr<int>& borrowedUPtr )
    {
        list.push_back( &borrowedUPtr );
    }

    void DoSomething()
    {
        for( const auto& ptr : uPtrList )
            // Perform read ops
    }
};

这些是我的意图: Owner 拥有 unique_ptr 并因此控制其生命周期。 SomeContainer 将存储对指针的 const 引用,因为不允许以任何方式重置或修改指针。
这是一种可行的方法还是我干扰了原力?

我看到两个可能的解决方案。

其中之一可能是您的所有者有 std::shared_ptr 并且 SomeContainer 保留了 std::weak_ptr 的列表,如下所示:

struct Owner
{
    std::shared_ptr<int> uPtr;
};

struct SomeContainer
{
    list<std::weak_ptr<int>> uPtrList;

    void Insert( std::shared_ptr<int> borrowedUPtr )
    {
        list.push_back( std::weak_ptr<int>(borrowedUPtr) );
    }
    //...
};

另一个可能是 SomeContainer 保留通过 std::unique_ptr::get 获得的 const 原始指针列表。由于 Owner 拥有所有权,如果你能保证 Owner 的寿命与 SomeContainer 一样长或更长,那么这样的策略没有错。就个人而言,我更喜欢这个:

struct Owner
{
    unique_ptr<int> uPtr;
};

struct SomeContainer
{
    list<const int*> uPtrList;

    //Could also be directly passed as a const int*
    void Insert( const unique_ptr<int>& borrowedUPtr )
    {
        list.push_back( borrwedUPtr.get() );
    }
    //...
};

根本不清楚为什么需要在这里使用智能指针。一个简单的成员变量就可以很好地表达所有权:

struct Owner
{
    int value;
};

然后观察者可以存储原始指针:

struct SomeContainer
{
    list<const int*> ptrList;

    void Insert( const int& borrowedValue)
    {
        ptrList.push_back( &borrowedValue);
    }

    void DoSomething()
    {
        for( const auto& ptr : ptrList)
            // Perform read ops
    }
};

这是假设您可以确信当观察者希望观察时所有者会活着。如果您对此没有信心,那么 unique_ptr 将无济于事,您将需要一些类似 weak_ptrshared_ptr 的东西。