68

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

4

6 に答える 6

93

std::unique_ptr一意の所有権セマンティクスを安全に提供します。ただし、非所有ポインターの必要性を排除するものではありません。std::shared_ptrには、非所有の対応する がありstd::weak_ptrます。生のポインタは、std::unique_ptrの非所有の対応物として動作します。

于 2012-05-29T17:23:28.697 に答える
83

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

std::unique_ptr<char[]> buffer( new char[1024] );
// ... fill the buffer
int rc = ::write( fd, buffer.get(), len );
于 2012-05-29T15:24:02.897 に答える
35

私が従う傾向があるルールは次のとおりです。呼び出し先が有効期間/所有権をいじっていない場合は、スマートポインターを渡さないでください。むしろ、生の C++ 参照 (推奨) または生のポインターを渡します。所有権と使用法を分離する方が、はるかにクリーンで柔軟だと思います。

于 2012-05-29T16:47:45.280 に答える
22

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

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

于 2012-05-29T15:24:39.420 に答える
-1

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

于 2012-05-29T15:23:04.720 に答える