Поскольку объекты ClassWithFooMember
«внутри», такие как vector
, выделяются отдельно , ваш foo_ptr
(или указатель на весь ClassWithFooMember
объект) будет остаются действительными независимо от любых операций с v
, пока существует (анонимный) объект ClassWithFooMember
. Например, сортировка v
или его перераспределение безвредны. v.erase(v.begin())
, конечно, уничтожит его, но даже тогда вы могли бы сначала написать любое из
auto p=std::move(v.front());
auto *q=v.front().release();
, что позволит объекту жить после полного уничтожения v
.
Все это верно вне зависимости от типа контейнера ; это преимущество, оплачиваемое дополнительной памятью и временем накладными расходами , используемыми для отдельного выделения. Также он не указывает на c на std::unique_ptr
(хотя в целом это хороший выбор по другим причинам); std::vector<T*>
будет иметь такое же поведение, включая то, что было бы безопасно сохранить T*
(или указатель на a T
), но не T*&
(или T**
), ссылающийся элементу vector
самому . (Соответствующая небезопасная вещь в вашем случае будет содержать std::unique_ptr<ClassWithFooMember>&
или std::unique_ptr<ClassWithFooMember>*
, чего вам вообще не следует делать в любом случае.)