std::unique_ptr::get
そもそもunique_ptrを持つ目的を無効にしませんか? この関数が状態を変更して、ポインターを保持しないことを期待していました。std::unique_ptr::get の実際の有用な使用法はありますか?
6 に答える
std::unique_ptr
一意の所有権セマンティクスを安全に提供します。ただし、非所有ポインターの必要性を排除するものではありません。std::shared_ptr
には、非所有の対応する がありstd::weak_ptr
ます。生のポインタは、std::unique_ptr
の非所有の対応物として動作します。
たとえば、C 関数に生のポインターを渡す必要があるたびに使用します。
std::unique_ptr<char[]> buffer( new char[1024] );
// ... fill the buffer
int rc = ::write( fd, buffer.get(), len );
私が従う傾向があるルールは次のとおりです。呼び出し先が有効期間/所有権をいじっていない場合は、スマートポインターを渡さないでください。むしろ、生の C++ 参照 (推奨) または生のポインターを渡します。所有権と使用法を分離する方が、はるかにクリーンで柔軟だと思います。
手が縛られていて、何かへのポインタを渡す必要がある場合、 はp.get()
よりも読みやすくなり&*p
ます。
unique_ptr
がポインタを保持しないように状態を変更する関数があり、その名前はrelease
です。これは主に、 からの直接構築を提供しない他のスマート ポインターに所有権を譲渡するのに役立ちますunique_ptr
。それ以外の使用は、リソースをリークするリスクがあります。
C API を呼び出す必要がある場合や、設計が不十分な C++ API を呼び出す必要がある場合は、明らかな状況です。