実際の C++ 標準では、次の規則を満たすコレクションを作成することは、不可能ではないにしても困難です。
- 例外安全性、
- 安価な内部操作 (実際の STL コンテナーでは、操作はコピーです)、
- 自動メモリ管理。
(1) を満たすために、コレクションは生のポインターを格納できません。(2) を満たすには、コレクションは生のポインターを格納する必要があります。(3) を満たすために、コレクションは値によってオブジェクトを格納する必要があります。
結論:3つの項目は互いに矛盾しています。
shared_ptr
コレクションが要素を移動する必要がある場合、コンストラクタとデストラクタの 2 つの呼び出しを行う必要があるため、項目 (2) は s が使用されている場合には満たされません。のような大規模memcpy()
なコピー/移動操作はできません。
unique_ptr
説明されている問題はとによって解決されるというのは正しいstd::move()
ですか? ツールを使用するコレクションは、次の 3 つの条件すべてを満たすことができます。
- 例外の副作用としてコレクションが削除されると、
unique_ptr
のデストラクタが呼び出されます。メモリリークなし。 unique_ptr
参照カウンター用の余分なスペースは必要ありません。したがって、その本体は、ラップされたポインターとまったく同じサイズである必要があります。- よくわかりませんが、これにより、同様の操作(?)
unique_ptrs
を使用してのグループを移動できるように見えますが、memmove()
- それが不可能な場合でも、
std::move()
オペレーターはunique_ptr
、コンストラクター/デストラクターのペアの呼び出しを行わずに各オブジェクトを移動できます。
unique_ptr
指定されたメモリの排他的所有権を持ちます。偶発的なメモリ リークは発生しません。
これは本当ですか?を使用するその他の利点は何unique_ptr
ですか?