2017-07-26 7 views
3

実装()

をオブジェクトにアクセスするには、のweak_ptrはshared_ptrのコンストラクタまたはメンバ関数ロックを使用してのshared_ptrに変換することができます。

ここでも、ブーストから:私の知る限り、1の参照カウントを持つ新しいのshared_ptrを作成shared_ptr<T>(*this)手段を返す理解し

shared_ptr<T> lock() const; 

//Returns: expired()? shared_ptr<T>(): shared_ptr<T>(*this). 

。これは間違いなく私たちが望むものではありません。だからおそらく私はそれを正しく理解していないでしょう。誰かが説明しますか?ありがとう!

答えて

3

いいえ、実際にはshared_ptrのポイントです。コピーされたインスタンスは同じ基礎データを指し、両方のインスタンスの参照カウントをインクリメントします。

つまり、shared_ptr<T>(*this)は、同じデータを指す追加のshared_ptrインスタンスを作成し、thisと新しいインスタンスの参照カウントを増やすことを意味します。


、元shared_ptrデータweak_ptrインスタンスを介してアクセスされるように、実際に本物のコードでより複雑であるが、効果的にオリジナルshared_ptrデータは、既存のすべての中で増加した共有参照カウントして(端で共有されています特定のshared_ptrオブジェクトのコピー)。

+0

ただし、 "Return:"行に示されているコードはスレッドセーフではありません。私はそれが今実際どのように実装されているのかを推測しています(私は標準ノートのコピーを「原子的に実行する」)。 –

+0

これはのconstのweak_ptr 'テンプレート明示的なshared_ptrのは(& r);'と呼ばれていることを? – Sanich

+0

はい、技術的に元のshared_ptrインスタンスがweak_ptrを介してアクセスされていますが、まだ()というを言及するの答えを更新を意味します。 – axalis