4

私は理解しようとしていますunique_ptr、、、shared_ptrそしてweak_ptrそれはc ++ 11に付属しています。

weak_ptrは、キャッシングやサイクルの破壊などに適していると聞いたことがあります。との相性が良いと聞いたことがありshared_ptrsます。

shared_ptrsしかし、この点に関して、との違いは何unique_ptrsですか? weak_ptrが一方のみで使用され、他方では使用されないのはなぜですか? 他の誰かが所有するものへの弱い参照を持ちたくないのはなぜですか?

4

3 に答える 3

7

技術的には、共有オブジェクトを管理するweak_ptr一連の の参照カウンタを保持するための手段です。shared_ptr最後のオブジェクトが破棄されるとオブジェクトは破棄されますが、その参照カウンターはsshared_ptrがある限り存続します。weak_ptrしたがって、まだ存在するオブジェクトを介してweak_ptr、オブジェクトがまだ存在するか、または破棄されたかを確認できます。

オブジェクトがまだ存在する場合は、 からオブジェクトを参照weak_ptrできる を取得できます。shared_ptr

これの主な使用法は、サイクルを壊すことです。

特に、オブジェクトはweak_ptrそれ自体の参照カウンターへの保持を含むことができます。これによりshared_ptr、オブジェクト自体からオブジェクトへの を取得できます。つまり、このオブジェクトに対するshared_ptr他の と同じ参照カウンタを使用するです。shared_ptrこれがどのように機能するかenable_shared_from_thisです。

unique_ptrには参照カウンターがないため、存在しない参照カウンターにしがみつくのは意味がありません。

于 2013-03-17T06:06:57.233 に答える
4

弱いポインターの主なポイントは、ポインターを強くすることを試みることができるということです。つまり、以下を所有しています。

auto strongPtr = weakPtr.lock();

if (strongPtr)
{
    // still existed, now have another reference to the resource
}
else
{
    // didn't still exist
}

最初のパスに注意してください。弱いポインタを強くするには、オブジェクトの所有権を取得する必要があります

これが意味をなさない理由unique_ptrです:弱いポインタを強くする唯一の方法は、他の場所からリソースを取得することです。そのためunique_ptrは、予期しないnullポインタを別の場所に残すことを意味します。shared_ptrそれを取ることは本当にそれを共有することを意味するので、パスを取得します。

于 2013-03-17T05:03:53.653 に答える
2

私もC++11を初めて使用するので、誰かがもっとよく知っているなら、修正をいただければ幸いです。

理由はあまりないと思います。そうしないと、shared_ptrの目的全体が損なわれるため、を使用することになりunique_ptrます。Aunique_ptrは、それが指すオブジェクトを完全に制御できるというセマンティクスを暗示しています。

于 2013-03-17T05:02:28.377 に答える