2017-03-09 10 views
2

私が理解しているように、割り当て解除された可能性のあるstd::shared_ptrによって参照されるメモリを参照する安全な方法として、std::weak_ptrが使用されています。 std::unique_ptrと一緒に使うことはできますか?weak_ptrはunique_ptrと一緒に機能しますか?

+3

["なぜweak_ptrをunique_ptrから構築できないのですか?"](http://stackoverflow.com/questions/29059343/why-cant-a-weak-ptr-be -p-a-unique-ptr) – WhozCraig

+4

いいえ、意味がありません。 'std :: weak_ptr'は' std :: unique_ptr'が持っていない* shared ownership *を必要とします。 – Galik

+2

unique_ptrは* unique *です。それは人生の目的です。 –

答えて

5

私はそれははstd ::解放された可能性がありshared_ptrsによって参照されるメモリを参照する安全な方法として使用されてweak_ptrを理解しています。

あなたは間違っています。 std::weak_ptrはオブジェクトにアクセスすることを許可しますが、所有権は共有されずにstd::shared_ptrによって維持されます。今あなたが実際にstd::weak_ptrを理解するとき、あなたの質問がstd::unique_ptrについて理解できないことを理解する必要があります。

1

いいえ。

残念ながら、std::shared_ptrを使用し、std::weak_ptrを一時的にロックする必要があることを文書化する必要があります。

+0

残念ながら、幸いにも? 'single_ptr'の特権ではありません:: – curiousguy

+0

@curiousguy"残念ながら "長期の単一所有権の意味を保持するために、ロックされた' std :: weak_ptr'を決して保持しないために外側のコードに依存しなければならないからです。 – Quentin

+0

ユニーク所有スマートptrの共有所有スマートptrの明確な構文と意味的優位性は、 'release'メソッド(例外ではなく、保証された動作)です。 unique_ptr_except_locked_weak_ptrを持つことができ、ロックが "短く"なることを期待することができますが、ロック(弱い参照)のロックは何かを残して最後の所有者になり、 'release()'は保証されません。 – curiousguy

2

std::unique_ptrにオブザーバとして機能する同等のポインタがありますが、std::weak_ptrと同じように安全性は提供されません。

そのポインタは生ポインタです。ユニークな所有者より長生きしていない場合は、安全に使用できます。

生ポインタの所有者の有効期間が終了したかどうかを知る必要がある場合は、いいえ、方法はありません。目標はstd::unique_ptrではありません。

関連する問題