簡體   English   中英

當 unique_ptr 在向量中時,對 std::unique_ptr<> owned object 的引用/ptr 是否安全?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM