弱参照スマート ポインタ 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 になります。