実際の 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ですか?