スマート ポインタ:weak_ptr (弱参照スマート ポインタ)

弱参照スマート ポインタ std::weak_ptr は、shared_ptr のアシスタントとみなすことができ、shared_ptr の内部ポインタを管理しません。std::weak_prt は演算子 * と -> をオーバーロードしません。ポインターを共有せず、リソースを操作できないため、その構築によって参照カウントが増加することはなく、その破壊によって参照カウントが減少することはありません。バイスタンダーは、shared_ptr で管理されるリソースの存在を監視します。

初期化:

#include<iostream>
#include<memory>
using namespace std;

int main()
{
    shared_ptr<int> sp(new int);

    //weak_ptr<int> wp1; 构造一个空weak_ptr对象
    weak_ptrr<int> wp1;

    //weak_ptr<int> wp2(wp1);    通过一个空weak_ptr对象构造了另一个空weak_ptr对象
    weak_ptr<int> wp2(wp1);

    //weak_ptr<int> wp3(sp);通过一个shared_ptr对象构造了一个可用的weak_ptr实例对象

    weak_ptr<int> wp3(sp);

    //wp4 = sp;    通过一个shared_ptr对象构造了一个可用的weak_ptr实例对象(这是一个隐式类型转换)
    weak_ptr<int> wp4;
    wp4 = sp;

    //wp5 = wp3; 通过一个weak_ptr对象构造了一个可用的weak_ptr实例对象
    weak_ptr<int> wp5;
    wp5 = wp3;

    return 0;
}

use_count()

現在監視されているリソースの参照カウントは、std::weak_ptr クラスが提供する use_count() メソッドを呼び出すことで取得できます。

shared_ptr<int> sp(new int);

weak_ptr<int> wp1;
weak_ptr<int> wp2(wp1);
weak_ptr<int> wp3(sp);
weak_ptr<int> wp4;
wp4 = sp;
weak_ptr<int> wp5;
wp5 = wp3;

cout<<"use_count:"<<endl;
cout<<"wp1:"<<wp1.use_count()<<endl;
cout<<"wp2:"<<wp2.use_count()<<endl;
cout<<"wp3:"<<wp3.use_count()<<endl;
cout<<"wp4:"<<wp4.use_count()<<enld;


cout<<"wp5:"<<wp5.use_count<<endl;
return 0;

use_count:
wp1:0
wp2:0
wp3:1
wp4:1
wp5:1

出力された結果から、弱参照スマート ポインター wp3、wp4、および wp5 が同じリソースを監視しているにもかかわらず、それらの参照カウントが変化していないことがわかります。これはさらに、weak_ptr がリソースを監視するだけで、リソースを管理しないことを証明します。

 期限切れ()

std::weak_ptr クラスによって提供されるexpired() メソッドを呼び出して、監視されているリソースが解放されたかどうかを判断します。

int main()
{
    shared_ptr<int> shared(new int(10));
    weak_ptr<int> weak(shared);
    cout<<"1.weak"<<(weak.expired()?"is":"is not")<<"expired"<<endl;

    shared.reset();
    cout<<"2.weak"<<(weak.expired()?"is":"is nor")<<"expired"<<endl;

    return 0;
}

//1.weak is not expired
//2.weak is expired

 weak_ptr は、shared_ptr によって管理されているリソースを監視します。共有スマート ポインタがshared.reset()を呼び出すと、管理されているリソースが解放されるため、weak.expired()関数の結果はtrueを返し、監視対象のリソースが使用できなくなったことを示します。

 ロック()

std::weak_ptrクラスが提供するlock()メソッドを呼び出して、監視対象リソースを管理するshared_ptrオブジェクトを取得します。

int main()
{
    shared_ptr<int> sp1,sp2;
    weak_ptr<int> wp;
    
    sp1 = std::make_shared<int>(520);
    wp = sp1;
    sp2 = wp.lock();
    cout<<"use_count:"<<wp.use_count()<<endl;

    sp1.reset();
    cout<<"use_count:"<<wp.use_count()<<endl;

    sp1 = wp.lock();
    cout<<"use_count:"<<wp.use_count()<<endl;

    cout<<"*sp1:"<< *sp1<<endl;
    coutMM"*sp2:"<< *sp2<<endl;

    reutrn 0;
}


use_count:2
use_count:1
use_count:2
*sp1:520
*sp2:520

sp2 = wp.lock(); lock() メソッドを呼び出して、weak_ptr オブジェクトによって監視されるリソースを管理するために使用される共有スマート ポインタ オブジェクトを取得し、このオブジェクトを使用して sp2 を初期化し、監視対象リソースの参照カウントが 2 である場合、 sp1.reset(); 共有スマート ポインタ sp1 がリセットされ、weak_ptr オブジェクトによって監視されているリソースの参照カウントが 1 減分されます、sp1=wp.lock(); sp1 は再初期化され、引き続きリソースを管理しますweak_ptr オブジェクトによって監視されるため、参照カウントは 1 増加し、共有スマート ポインター オブジェクト sp1 と sp2 は同じメモリ ブロックを管理するため、最終的に出力されるメモリの結果は同じで、どちらも 520 になります。

おすすめ

転載: blog.csdn.net/four_two_six_/article/details/130887088