[英]Is having a reference/ptr to std::unique_ptr<> owned object safe when the unique_ptr is in a vector?
從表面上看,我喜歡使用unique_ptr
的容器來擁有數據的模式。 我的問題是,如果我知道unique_ptr
不會從 scope 中獲取 go,那么對這樣一個擁有的 object 的成員進行指針/引用是否安全?
例如我可能有
auto v = std::vector<std::unique_ptr<ClassWithFooMember>>{};
v.emplace_back(std::make_unique<ClassWithFooMember>());
我可以安全地做嗎
auto *foo_ptr = &(v.at(0)->foo);
如果我知道v
將比foo_ptr
並且v
永遠不會刪除任何項目?
如果向v
添加了很多項或者如果v
的內部表示發生了變化,會發生什么情況? ClassWithFooMember
實例的 memory 布局會改變嗎?
謝謝你。
由於“在”此類vector
中的ClassWithFooMember
對象是單獨分配的,因此只要(匿名) ClassWithFooMember
object 存在,無論對v
進行任何操作,您的foo_ptr
(或指向整個ClassWithFooMember
對象的指針)都將保持有效。 例如,對v
進行排序或使其重新分配是無害的。 v.erase(v.begin())
當然會破壞它,但即使那樣你也可能先寫了
auto p=std::move(v.front());
auto *q=v.front().release();
這將使 object 在完全銷毀v
后繼續存在。
無論容器類型如何,這一切都是正確的; 這是額外的 memory 和用於單獨分配的時間開銷所支付的收益。 它也不是特定於std::unique_ptr
的(盡管出於其他原因,這通常是一個不錯的選擇); std::vector<T*>
將具有相同的行為,包括保留T*
(或指向T
的指針)而不是引用vector
元素的T*&
(或T**
)是安全的本身。 (在你的情況下相應的不安全的事情是持有一個std::unique_ptr<ClassWithFooMember>&
或std::unique_ptr<ClassWithFooMember>*
,你通常不應該這樣做。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.