多个实例包含对unique_ptr的引用

时间:2017-05-17 14:50:04

标签: c++ smart-pointers 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引用,因为它不允许以任何方式重置或修改指针。
这是一种可行的方法还是我扰乱了这种力量?

2 个答案:

答案 0 :(得分:4)

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

其中一个可能是您的所有者拥有std::shared_ptrSomeContainer保留了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的生存时间长于SomeContainer,则此类策略没有任何问题。 Personnaly,我更喜欢这个:

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() );
    }
    //...
};

答案 1 :(得分:2)

目前尚不清楚为什么你需要在这里使用智能指针。一个简单的成员变量就表达了所有权:

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之类的内容。