私は私のリファレンスのに対し、別の文脈では、古典的な「ポインタ」として「所有権」と「参照」に異なるタイプのshared_ptrを使用する方が良いでしょうか?
Reference<Type> m_someFoo
を所有しているオブジェクトのためのポインタのようなオブジェクトに
Ownership<Type> m_foo
を使用して対処したいと思いますは元のオブジェクトがもはや存在しないとき(例えばnullptrを返すことによって)知っているべきであり、さらに、元のオブジェクトが短時間の間削除されないようにする必要がありますロック)。
私はshared_ptrの(所有権)とのweak_ptr(参考)は同様の機能を提供することを知っています。しかし、をweak_ptrにロックし、raw ptrにアクセスするには、shared_ptrの作成に時間がかかります。また、raw ptrにアクセスする前に(例えば、オブジェクトが現在削除されていないことを知りながら)weak_ptrをロックしないようにすることはできません。
は、それは次のように所有とリファレンスを実装するのが賢明です:
- 所有はそのリファレンス S(例えば
std::list<Reference<Type>*>
) - 所有するオブジェクトが崩壊、これらのアドレスを知っています参照はnullptrに設定されています
- リファレンスは、ロック時に
uint m_lockCount
で所有 - にptrを含ま
m_lockCount++
、m_lockCount != 0
このソリューションは、いくつかのために特に実現可能だろうというとき所有m_lockCount--
"むしろ遅いshared_ptrの作成を伴います"。なぜそれが遅いのか分かりますか?所有されているオブジェクトが崩壊すると、これらの参照はnullptrに設定され、参照にはptrが所有権のm_lockCount、ロック時にはm_lockCount ++、ロック解除時にはm_lockCount--、所有権ではm_lockCount!= 0のときオブジェクトを解放できません。 また、思っているよりもはるかに速いと思います。 –
あなたが書いたことは、まさに 'shared_ptr'と' weak_ptr'があなたのために設計されたものです。それらをそのまま使用し、手動で複製しないでください。 'weak_ptr'をロックすると新しい' shared_ptr'が作成されますが、元の 'share_ptr'からデータポインタを共有するので、その作成は速くなります。コピーされた' shared_ptr'が有効範囲外になるまで、refcountをインクリメントします。 refcountingの全ポイントは、ロックがアクティブなときに高速コピーであり、所有オブジェクトを解放しません。 –
ホイールを再実装しないでください。 –