web-dev-qa-db-ja.com

std :: unique_ptr :: getのポイントは何ですか

std::unique_ptr::getは、そもそもunique_ptrを使用する目的に反しませんか?この関数がポインターを保持しないように、この関数が状態を変更することを期待していました。 std :: unique_ptr :: getの実際の便利な使用法はありますか?

51
lezebulon

生のポインターをC関数などに渡す必要があるたびに使用します。

std::unique_ptr<char[]> buffer( new char[1024] );
// ... fill the buffer
int rc = ::write( fd, buffer.get(), len );
64

std::unique_ptrは、一意の所有権セマンティクスを安全に提供します。ただし、それはnon-owningポインターの必要性を排除しません。 std::shared_ptrには非所有者、std::weak_ptr。生のポインタはstd::unique_ptrの非所有者。

47
bames53

私が従う傾向があるのはこれです:呼び出し先がライフタイム/所有権をいじっていない場合、スマートポインターを渡さないでください。むしろ、生のC++参照(推奨)または生のポインターを渡します。所有権の懸念を使用から分離する方がはるかにクリーンで柔軟です。

26
Nevin

手を縛って何かにポインタを渡す必要がある場合、p.get()&*pよりも読みやすくなります。

unique_ptrがポインターを保持しないように状態を変更する関数があり、その名前はreleaseです。これは、unique_ptrからの直接の構築を提供しない他のスマートポインターに所有権を転送する場合に最も役立ちます。その他の使用は、リソースをリークするリスクがあります。

16

ハーブサッターには良い説明があります(3:40頃) https://www.youtube.com/watch?v=JfmTagWcqoE

主な利点は、一意のポインターが、そのポインターに対する他の参照の数を追跡することです。所有権を操作する場合にのみ、一意のポインターを使用します。そのポインターを使用してデータを処理する場合は、生のポインターを渡します。

3
Mikael

C APIまたは設計が不十分なC++ APIを呼び出す必要がある場合は、明らかな状況があります。

0
K-ballo