std::unique_ptr::get
は、そもそもunique_ptrを使用する目的に反しませんか?この関数がポインターを保持しないように、この関数が状態を変更することを期待していました。 std :: unique_ptr :: getの実際の便利な使用法はありますか?
生のポインターをC関数などに渡す必要があるたびに使用します。
std::unique_ptr<char[]> buffer( new char[1024] );
// ... fill the buffer
int rc = ::write( fd, buffer.get(), len );
std::unique_ptr
は、一意の所有権セマンティクスを安全に提供します。ただし、それはnon-owningポインターの必要性を排除しません。 std::shared_ptr
には非所有者、std::weak_ptr
。生のポインタはstd::unique_ptr
の非所有者。
私が従う傾向があるのはこれです:呼び出し先がライフタイム/所有権をいじっていない場合、スマートポインターを渡さないでください。むしろ、生のC++参照(推奨)または生のポインターを渡します。所有権の懸念を使用から分離する方がはるかにクリーンで柔軟です。
手を縛って何かにポインタを渡す必要がある場合、p.get()
は&*p
よりも読みやすくなります。
unique_ptr
がポインターを保持しないように状態を変更する関数があり、その名前はrelease
です。これは、unique_ptr
からの直接の構築を提供しない他のスマートポインターに所有権を転送する場合に最も役立ちます。その他の使用は、リソースをリークするリスクがあります。
ハーブサッターには良い説明があります(3:40頃) https://www.youtube.com/watch?v=JfmTagWcqoE
主な利点は、一意のポインターが、そのポインターに対する他の参照の数を追跡することです。所有権を操作する場合にのみ、一意のポインターを使用します。そのポインターを使用してデータを処理する場合は、生のポインターを渡します。
C APIまたは設計が不十分なC++ APIを呼び出す必要がある場合は、明らかな状況があります。