Search code examples
c++c++11shared-ptrsmart-pointers

Transferring a vector<shared_ptr<T>> by reference without bypassing shared semantics


I have a class which contains a vector<shared_ptr<T>>:

using SharedItems = std::vector<std::shared_ptr<Item>>;

class LargeLift
{
public:
    SharedItems& getItems()
    {
        return _items;
    }

    void setSharedItems(SharedItems& items)
    {
        _items = items;
    }

private:
    SharedItems _items;
};

I then do the following:

LargeLift b;
{
    LargeLift a;
    // Gets populated

    SharedItems& items = a.getItems();
    b.setSharedItems(items);
}

// Variable a is now out of scope

SharedItems& items2 = b.getItems();

Is the last line valid, given a has gone out of scope?


Solution

  • As written, your code is safe - nothing has gone out of scope.

    In this example, a does go out of scope, but things are still safe:

    LargeLift b;
    {
        LargeLift a;
        // Gets populated
    
        SharedItems& items = a.getItems();
    
        //give b its own copy
        b.setSharedItems(items);
    }
    
    // safe, because b owns its own copy
    SharedItems& items2 = b.getItems();
    

    In this example, they are not safe:

    SharedItems* p_items;
    
    LargeLift b;
    {
        LargeLift a;
        // Gets populated
    
        items = &a.getItems();
    }
    
    // unsafe, items is already dangling
    b.setSharedItems(*p_items);
    
    SharedItems& items2 = b.getItems();