У меня есть класс, который содержит 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;
};
Затем я делаю следующее:
LargeLift b;
{
LargeLift a;
// Gets populated
SharedItems& items = a.getItems();
b.setSharedItems(items);
}
// Variable a is now out of scope
SharedItems& items2 = b.getItems();
Действительна ли последняя строка, учитывая, что a вышла за рамки?
a не вышел за рамки в приведенном выше примере
@ Эрик Я говорю, что да, чтобы помочь в моем вопросе.





Как написано, ваш код безопасен — ничего не вышло за рамки.
В этом примере aделает выходит за рамки, но все еще безопасно:
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();
В этом примере они небезопасны:
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();
Код передает ссылку в setSharedItems, но SharedItems _items; НЕ является ссылкой, поэтому _items = items; копирует items в _items. a._items отличается от b._items, поэтому b будет в порядке после того, как a исчезнет. Поскольку b сделал копии всех shared_ptr, счетчики ссылок не достигли нуля, и все указатели по-прежнему будут в порядке.
Да, это действительно. Ваш класс содержит вектор по значению, поэтому в вашем установщике
_item = item
Скопирует весь вектор
@Yksisarvinen, так что в приведенном выше коде последняя строка будет небезопасной, потому что a вышла за рамки. Итак, я должен заставить getter() возвращаться по значению?