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?
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();