unique_ptrがベクター内にある場合、std :: unique_ptr <>が所有するオブジェクトへの参照/ ptrは安全ですか?

そして

表面的には、unique_ptrデータを所有するためののコンテナを持つパターンが好きです。私の質問は、がunique_ptr範囲外にならないことがわかっている場合、そのような所有オブジェクトのメンバーへのポインタ/参照を取得するのは安全ですか?

例えば私は持っているかもしれません

auto v = std::vector<std::unique_ptr<ClassWithFooMember>>{};
v.emplace_back(std::make_unique<ClassWithFooMember>());

その後、安全に行うことができますか

auto *foo_ptr = &(v.at(0)->foo);

それvが長持ちfoo_ptrv、アイテムが削除されることは決してないことがわかっている場合はどうなりますか?

多くのアイテムが追加されたv場合またはvの内部表現が変更された場合はどうなりますか?ClassWithFooMemberインスタンスのメモリレイアウトは変更されますか?

ありがとうございました。

デイビスヘリング

以来ClassWithFooMember、このようなA「の」オブジェクトがvector割り当てられている個別に、あなたfoo_ptr(またはポインタ全体の ClassWithFooMemberオブジェクトが)にかかわらず、有効なままになります任意の上で操作v限り(匿名)としてClassWithFooMemberオブジェクトが存在します。たとえば、並べ替えvや再割り当ては無害です。v.erase(v.begin())もちろん、それを破壊するでしょうが、それでもあなたは最初にどちらかを書いたかもしれません

auto p=std::move(v.front());
auto *q=v.front().release();

これは、完全破壊 した後、オブジェクトを存続させますv

これはすべて、コンテナの種類に関係なく当てはまります。これは、個別の割り当てに使用される追加のメモリと時間のオーバーヘッドによって支払われる利点です。どちらも特定のものではありませんstd::unique_ptr(ただし、他の理由から、ここでは一般的に適切な選択です)。要素自体を参照する(またはではなく、(またはポインタstd::vector<T*>を保持しても安全であることを含め、同じ動作をしますあなたの場合の対応する危険なことは、またはを保持することですが、これは通常、とにかく行うべきではありません。)T*TT*&T**vectorstd::unique_ptr<ClassWithFooMember>&std::unique_ptr<ClassWithFooMember>*

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ