亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++標(biāo)準(zhǔn)庫(kù)學(xué)習(xí)之weak_ptr智能指針用法詳解

 更新時(shí)間:2023年12月06日 14:22:53   作者:tsm  
這篇文章主要為大家詳細(xì)介紹了C++標(biāo)準(zhǔn)庫(kù)中weak_ptr智能指針用法的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

在上一篇文章中介紹了 shared_ptr 這種智能指針,他為了解決在指針沒(méi)有引用的情況下自動(dòng)回收資源這種情況而產(chǎn)生的,但是在部分情況下會(huì)產(chǎn)生另一種問(wèn)題,那就是兩個(gè)智能指針被循環(huán)引用 , a 使用 shared_ptr 引用了b ,同時(shí) b 使用 shared_ptr 引用了 a,在 方法執(zhí)行完成后 ,a 與 b 的智能指針都會(huì)被 釋放,但是 由于他們互相持有 , a 與 b 的 used_count >0 ,那么就不會(huì)釋放他們的資源,看下面的例子

#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class Person{
public:
    // 構(gòu)造方法 ,name 是必要參數(shù)  mum 與 dad 是非必要參數(shù) 
    Person(string name,shared_ptr<Person> mum = nullptr ,shared_ptr<Person> dad = nullptr)
    :name(name) ,mum(mum),dad(dad)// 此種初始化方式被經(jīng)常應(yīng)用到 jni 源碼上
    {
    }
    // 析構(gòu)函數(shù),資源被釋放時(shí)會(huì)被調(diào)用
    ~Person(){
        cout<<"對(duì)象名稱(chēng)是->" << name<< "被回收了"<<endl;
    }
    // 向量 
    vector<shared_ptr<Person>> child;
    //名字
    string name;
    // 智能指針引用mum
    shared_ptr<Person> mum;
    //智能指針引用dad
    shared_ptr<Person> dad;
};
// 初始化 家人,讓他們循環(huán)引用
shared_ptr<Person> getFamily(const string& name){
    shared_ptr<Person> mum(new Person(name +"'s Mum"));
    shared_ptr<Person> dad(new Person(name +"'s Dad"));
    shared_ptr<Person> child(new Person(name,mum,dad));
    mum->child.push_back(child);
    dad->child.push_back(child);
    return child;
}
int main(){
    shared_ptr<Person> tsm=  getFamily("tsm");
    cout<< "------------before  change-----------"<<endl;
    cout << tsm->dad->name<<endl;
    cout << tsm->mum->name<<endl;
    cout << tsm->name<<endl;
    cout<<"tsm 的引用個(gè)數(shù)" <<tsm.use_count()<<endl;
    cout<< "------------start change-----------"<<endl;
    tsm = getFamily("tsm1");
    cout<< "------------after change-----------"<<endl;
    system("pause");
    return 0;
}

結(jié)果:

D:\CWorkSpace\tsmTest\cmake-build-debug\tsmTest.exe
------------before  change-----------
tsm's Dad
tsm's Mum
tsm
tsm 的引用個(gè)數(shù)3
------------start change-----------
------------after change-----------
. . . pause . . . 

發(fā)現(xiàn)在為 tsm 這個(gè)變量二次賦值時(shí),第一次 shared_ptr 指針指向的資源內(nèi)存應(yīng)該是被釋放的,但是他們的析構(gòu)函數(shù)并沒(méi)有被執(zhí)行,那就證明他的資源并沒(méi)有被釋放,那么我們?nèi)绾蝸?lái)修改內(nèi),這就引出了我們今天的主角 weak_ptr

修改如下

class Person{
public:
    // 構(gòu)造方法 ,name 是必要參數(shù)  mum 與 dad 是非必要參數(shù)
    Person(string name,shared_ptr<Person> mum = nullptr ,shared_ptr<Person> dad = nullptr)
    :name(name) ,mum(mum),dad(dad)// 此種初始化方式被經(jīng)常應(yīng)用到 jni 源碼上
    {
    }
    // 析構(gòu)函數(shù),資源被釋放時(shí)會(huì)被調(diào)用
    ~Person(){
        cout<<"對(duì)象名稱(chēng)是->" << name<< "被回收了"<<endl;
    }
    // 將向量中的引用使用  weak_ptr ,打破互相引用即可
    vector<weak_ptr<Person>> child;
    //名字
    string name;
    // 智能指針引用mum
    shared_ptr<Person> mum;
    //智能指針引用dad
    shared_ptr<Person> dad;
};

修改后的結(jié)果如下:

------------before  change-----------
tsm's Dad
tsm's Mum
tsm
tsm 的引用個(gè)數(shù)1
------------start change-----------
對(duì)象名稱(chēng)是->tsm被回收了
對(duì)象名稱(chēng)是->tsm's Dad被回收了
對(duì)象名稱(chēng)是->tsm's Mum被回收了
------------after change-----------

發(fā)現(xiàn)在使用 weak_ptr 打破互相引用的后, 被覆蓋的 tsm 的析構(gòu)函數(shù)被成功調(diào)用了,

weak_ptr 的使用場(chǎng)景主要有2個(gè)

1: 打破 shared_ptr 使用混亂出現(xiàn)的情況導(dǎo)致循環(huán)引用的情況,

2: 如果持有該 shared_ptr 的對(duì)象的生命周期是大于 該 shared_ptr 指針的生命周期的情況,就會(huì)導(dǎo)致 shared_ptr 資源無(wú)法被回收,

weak_ptr 的創(chuàng)建方式有3中

1:

weak_ptr<Person> t0; //構(gòu)造空對(duì)象

2:

weak_ptr<Person> t1(t0); //使用拷貝構(gòu)造函數(shù)

3:

shared_ptr<Person> tsm=  getFamily("tsm");

weak_ptr<Person> t2(tsm);

檢查weak_ptr 是否還有效

t2.expired() 

expired 源碼如下

bool
expired() const noexcept
{ return _M_refcount._M_get_use_count() == 0; }

可以看到 返回的是 use_count ,那就證明 if(!t2.expired) 則證明他是有效的

使用 weak_ptr,使用lock 方法將 weak_ptr 轉(zhuǎn)換成 shared_ptr ,防止在使用過(guò)程中資源被回收

shared_ptr<Person> tt =  t2.lock();

看一下lock 的源碼

shared_ptr<_Tp>
lock() const noexcept
{ return shared_ptr<_Tp>(*this, std::nothrow); }

到此這篇關(guān)于C++標(biāo)準(zhǔn)庫(kù)學(xué)習(xí)之weak_ptr智能指針用法詳解的文章就介紹到這了,更多相關(guān)C++ weak_ptr智能指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論