
138
|
4 章 スマートポインタ
ドを指すポインタが不正になり、子ノードが不正ポインタを辿る危険性はないのです。
もちろん、ポインタを基にしたデータ構造のすべてが厳密な階層をとる訳ではありませんので、
キャッシュ機能や observer のリストを実装するなどの場合に備え、std::weak_ptr が使用できる
と覚えておくと良いでしょう。
効率性の観点から言えば、std::weak_ptr について言えることはすべて std::shared_ptr と本
質的に同じです。std::weak_ptr オブジェクトのサイズは std::shared_ptr と同じですし、使用
するコントロールブロックも同じです(項目 19 を参照)。また、コンストラクト、デストラクト、代
入などの演算がアトミックなレファレンスカウント操作を伴う点も変わりません。本項目の冒頭で
std::weak_ptr はレファレンスカウントに関与しないと述べたので、この点は意外に聞こえるかも
しれません。しかし意味が異なります。著者が述べたことは、std::weak_ptr はオブジェクトの共
同所有権(shared ownership)に関与しない、そのため対象オブジェクトのレファレンスカウント
(pointed-to object’s reference count)には影響しない、です。実際にはコントロールブロック内に
レファレンスカウントがもう 1 つ存在し、この 2 番目のレファレンスカウントこそ std::weak_ptr ...