最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言?智能指針?shared_ptr?和?weak_ptr

 更新時(shí)間:2022年04月11日 18:50:33   作者:哈利馬其  
這篇文章主要介紹了C語(yǔ)言?智能指針?shared_ptr?和?weak_ptr,weak_ptr引入可以解決shared_ptr交叉引用時(shí)無(wú)法釋放資源的問(wèn)題,下面來(lái)學(xué)習(xí)具體相關(guān)內(nèi)容吧,需要的朋友可以參考一下

weak_ptr引入可以解決shared_ptr交叉引用時(shí)無(wú)法釋放資源的問(wèn)題。

示例代碼:

#include <iostream>
#include <memory>

using namespace std;

class B;

class A{
public:
? ? A(){cout << "A constructor ... "<< endl;}
? ? ~A(){cout << "A destructor ..." << endl;}
? ? std::shared_ptr<B> pb;
};

class B{
public:
? ? B(){cout << "B constructor ... "<< endl;}
? ? ~B(){cout << "B destructor ..." << endl;}
? ? std::shared_ptr<A> pa;
};

int main(int argc, char **argv) {
? ??
? ? std::shared_ptr<int> a = std::make_shared<int>(3);
? ? std::shared_ptr<char> b = std::make_shared<char>('a');
? ??
? ? std::cout << "shared_ptr object(int) size = " << sizeof(a) << std::endl;
? ? std::cout << "shared_ptr object(char) size = " << sizeof(b) << std::endl;
? ??
? ? std::weak_ptr<A> shadow_a;
? ? std::weak_ptr<B> shadow_b;
? ??
? ? {
? ? std::shared_ptr<A> ptr_a = std::make_shared<A>();
? ? std::shared_ptr<B> ptr_b = std::make_shared<B>();
? ??
? ? shadow_a = ptr_a;
? ? shadow_b = ptr_b;
? ??
? ? ptr_a->pb = ptr_b;
? ? ptr_b->pa = ptr_a;
? ??
? ? cout << "reference count of A = " << shadow_a.use_count() << endl;
? ? cout << "reference count of B = " << shadow_b.use_count() << endl;
? ? cout << endl;?
? ? }
? ??
? ? cout << "reference count of A = " << shadow_a.use_count() << endl;
? ? cout << "reference count of B = " << shadow_b.use_count() << endl;
? ??
? ? std::cout << "Hello, world!" << std::endl;
? ? return 0;
}

運(yùn)行代碼得到以下輸出:

shared_ptr object(int) size = 16
shared_ptr object(char) size = 16
A constructor ... 
B constructor ... 
reference count of A = 2
reference count of B = 2

reference count of A = 1
reference count of B = 1
Hello, world!

從結(jié)果可以看出,由于交叉引用導(dǎo)致申請(qǐng)的內(nèi)存A,B無(wú)法正常釋放。
為什么會(huì)這樣呢?這個(gè)應(yīng)該從析構(gòu)原理進(jìn)行考慮,shared_ptr引用計(jì)數(shù)需要為0才會(huì)進(jìn)行析構(gòu)!但是ptr_a離開(kāi)作用域會(huì)導(dǎo)致A引用計(jì)數(shù)減少1,但是A的引用計(jì)數(shù)此時(shí)為1,那么 pb不會(huì)釋放;同理,ptr_b離開(kāi)作用域會(huì)導(dǎo)致B引用計(jì)數(shù)減少1,但是B的引用計(jì)數(shù)為此時(shí)為1,那么pa不會(huì)釋放。如此導(dǎo)致了資源無(wú)法釋放掉。
由于weak_ptr并不會(huì)改變shared_ptr的引用計(jì)數(shù),所以修改類A,和類B中的shared_ptr對(duì)象為weak_ptr對(duì)象即可釋放資源。

修改后的代碼如下:

#include <iostream>
#include <memory>

using namespace std;

class B;

class A{
public:
? ? A(){cout << "A constructor ... "<< endl;}
? ? ~A(){cout << "A destructor ..." << endl;}
? ? //std::shared_ptr<B> pb;
? ? std::weak_ptr<B> pb;
};

class B{
public:
? ? B(){cout << "B constructor ... "<< endl;}
? ? ~B(){cout << "B destructor ..." << endl;}
? ? //std::shared_ptr<A> pa;
? ? std::weak_ptr<A> pa;
};

int main(int argc, char **argv) {
? ??
? ? std::shared_ptr<int> a = std::make_shared<int>(3);
? ? std::shared_ptr<char> b = std::make_shared<char>('a');
? ??
? ? std::cout << "shared_ptr object(int) size = " << sizeof(a) << std::endl;
? ? std::cout << "shared_ptr object(char) size = " << sizeof(b) << std::endl;
? ??
? ? std::weak_ptr<A> shadow_a;
? ? std::weak_ptr<B> shadow_b;
? ??
? ? {
? ? std::shared_ptr<A> ptr_a = std::make_shared<A>();
? ? std::shared_ptr<B> ptr_b = std::make_shared<B>();
? ??
? ? shadow_a = ptr_a;
? ? shadow_b = ptr_b;
? ??
? ? ptr_a->pb = ptr_b;
? ? ptr_b->pa = ptr_a;
? ??
? ? cout << "reference count of A = " << shadow_a.use_count() << endl;
? ? cout << "reference count of B = " << shadow_b.use_count() << endl;
? ? cout << endl;?
? ? }
? ??
? ? cout << "reference count of A = " << shadow_a.use_count() << endl;
? ? cout << "reference count of B = " << shadow_b.use_count() << endl;
? ??
? ? std::cout << "Hello, world!" << std::endl;
? ? return 0;
}

運(yùn)行結(jié)果如下,可以正常釋放資源。

shared_ptr object(int) size = 16
shared_ptr object(char) size = 16
A constructor ... 
B constructor ... 
reference count of A = 1
reference count of B = 1

B destructor ...
A destructor ...
reference count of A = 0
reference count of B = 0
Hello, world!

到此這篇關(guān)于C語(yǔ)言 智能指針 shared_ptr 和 weak_ptr的文章就介紹到這了,更多相關(guān) shared_ptr 和 weak_ptr內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊

    C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C語(yǔ)言模擬實(shí)現(xiàn)memmove的示例代碼

    C語(yǔ)言模擬實(shí)現(xiàn)memmove的示例代碼

    memmove函數(shù)用于拷貝字節(jié),如果目標(biāo)區(qū)域和源區(qū)域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區(qū)域的字節(jié)拷貝到目標(biāo)區(qū)域中,但復(fù)制后源內(nèi)容會(huì)被更改。本文主要介紹了C語(yǔ)言模擬實(shí)現(xiàn)memmove的示例代碼,需要的可以參考一下
    2022-12-12
  • C++使用windwos?api實(shí)現(xiàn)獲取計(jì)算機(jī)基本信息

    C++使用windwos?api實(shí)現(xiàn)獲取計(jì)算機(jī)基本信息

    這篇文章主要為大家詳細(xì)介紹了C++如何使用windwos?api實(shí)現(xiàn)獲取windwos計(jì)算機(jī)的基本信息,包括計(jì)算機(jī)名稱、操作系統(tǒng)版本、處理器信息等,需要的可以參考一下
    2023-04-04
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易三子棋

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易三子棋

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易三子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C語(yǔ)言一維數(shù)組初步學(xué)習(xí)筆記

    C語(yǔ)言一維數(shù)組初步學(xué)習(xí)筆記

    這篇文章主要介紹了C語(yǔ)言一維數(shù)組初步學(xué)習(xí)筆記,包括指針訪問(wèn)數(shù)組等重要知識(shí)點(diǎn),需要的朋友可以參考下
    2016-05-05
  • C++中for循環(huán)與while循環(huán)的區(qū)別總結(jié)

    C++中for循環(huán)與while循環(huán)的區(qū)別總結(jié)

    這篇文章主要給大家介紹了關(guān)于C++中for循環(huán)與while循環(huán)的區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • C連接Mysql數(shù)據(jù)庫(kù)代碼

    C連接Mysql數(shù)據(jù)庫(kù)代碼

    使用C語(yǔ)言連接Mysql數(shù)據(jù)庫(kù)的方法,大家可以看看
    2013-11-11
  • c++中冒號(hào)(:)和雙冒號(hào)(::)的使用說(shuō)明

    c++中冒號(hào)(:)和雙冒號(hào)(::)的使用說(shuō)明

    以下是對(duì)c++中冒號(hào)和雙冒號(hào)的用法進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-07-07
  • C++實(shí)現(xiàn)歸并排序算法

    C++實(shí)現(xiàn)歸并排序算法

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)歸并排序算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++實(shí)現(xiàn)LeetCode(210.課程清單之二)

    C++實(shí)現(xiàn)LeetCode(210.課程清單之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(210.課程清單之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論

太康县| 和政县| 五原县| 临夏县| 东乡县| 潼关县| 盐源县| 宜兰市| 武胜县| 新乡市| 石棉县| 竹山县| 依安县| 马鞍山市| 德安县| 朝阳县| 永靖县| 古丈县| 额尔古纳市| 延长县| 大冶市| 巍山| 东平县| 南宫市| 九龙城区| 长寿区| 大竹县| 桦南县| 资兴市| 青州市| 巴彦淖尔市| 台中县| 青冈县| 柳江县| 皮山县| 丰都县| 玉龙| 江孜县| 炉霍县| 抚顺县| 南木林县|