循環参照を壊すためにshare_ptrと連携するweak_ptrについて多くのことを学びました。それはどのように機能しますか?それをどのように使用しますか?どんな体でも私に例をあげることができますか?私はここで完全に迷子になっています。
もう1つの質問、強力な指針は何ですか?
循環参照を壊すためにshare_ptrと連携するweak_ptrについて多くのことを学びました。それはどのように機能しますか?それをどのように使用しますか?どんな体でも私に例をあげることができますか?私はここで完全に迷子になっています。
もう1つの質問、強力な指針は何ですか?
強力なポインタは、オブジェクトへの強力な参照を保持します。つまり、ポインタが存在する限り、オブジェクトは破棄されません。
オブジェクトは、すべてのポインタを個別に「認識」するのではなく、その数だけを認識します。これは、強力な参照カウントです。
weak_ptrの種類はオブジェクトを「記憶」しますが、オブジェクトの破棄を妨げることはありません。弱いポインタを介してオブジェクトに直接アクセスすることはできませんが、弱いポインタから強いポインタを作成することはできます。オブジェクトがもう存在しない場合、結果の強力なポインターはnullになります。
shared_ptr<int> sp(new int);
weak_ptr<int> wp(sp);
shared_ptr<int> stillThere(wp);
assert(stillThere); // yes, the original object still exists, we can now use it
stillThere.reset(); // releasing the strong reference
sp.reset(); // here, the object gets destroyed,
// because there's only one weak_ptr left
shared_ptr<int> notReally(wp);
assert(!notReally); // the object is destroyed,
// you can't get a strong pointer to it anymore
参照カウントには含まれないため、弱いポインターが存在する場合でもリソースを解放できます。weak_ptrを使用する場合は、そこからshared_ptrを取得し、参照カウントを一時的に増やします。リソースがすでに解放されている場合、shared_ptrの取得は失敗します。
Q2:shared_ptrは強力なポインターです。それらのいずれかが存在する限り、リソースを解放することはできません。