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

解析c++ 中智能指針引用計(jì)數(shù)為什么不是0原理

 更新時(shí)間:2023年08月31日 10:12:13   作者:bayes  
這篇文章主要為大家介紹了C語(yǔ)言中智能指針引用計(jì)數(shù)為什么不是0原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

問(wèn)題示例1:

#include<memory>
#include<cstdio>
#include<map>
using namespace std;
int main() {
    shared_ptr<int> ptr = make_shared<int>(100);
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    map<int, shared_ptr<int>> mp;
    mp.insert(pair<int, shared_ptr<int>>(1, ptr));
    mp.insert(pair<int, shared_ptr<int>>(2, ptr));
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    mp.clear();
    mp.clear();
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    return 0;
}

輸出:
=100,count=1
=100,count=3
=100,count=1 // 為什么這里引用計(jì)數(shù)是1而不是0呢?

問(wèn)題示例2:

#include<memory>
#include<cstdio>
#include<map>
using namespace std;
int main() {
    shared_ptr<int> ptr = make_shared<int>(100);
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    map<int, shared_ptr<int>> mp;
    mp.insert(pair<int, shared_ptr<int>>(1, ptr));
    mp.insert(pair<int, shared_ptr<int>>(2, ptr));
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    ptr.reset();
    printf("count=%ld\n", ptr.use_count());
    return 0;
}

輸出:
=100,count=1
=100,count=3
count=0 //這里為什么是0而不是2呢? 一直理解的 reset()是引用計(jì)數(shù)減1.

解析

問(wèn)題1:

ptr 還在,還有一個(gè)引用。

問(wèn)題2:

reset 之后,ptr 的指向改變,引用計(jì)數(shù)已經(jīng)不是原來(lái)指針的引用計(jì)數(shù)了。新指針是個(gè) nullptr ,引用計(jì)數(shù)為 0 。原來(lái)的指針引用計(jì)數(shù)是 2 ,兩個(gè)引用都在 map 里,已經(jīng)無(wú)法通過(guò) ptr 訪問(wèn)。

  • 對(duì)于問(wèn)題 1 中的第三次輸出,ptr 沒(méi)有釋放,因此還有 1 個(gè)引用計(jì)數(shù)占用,打印 1.
  • 對(duì)于問(wèn)題 2 中的第三次輸出,是 ptr 這個(gè)共享指針本身釋放,而非資源釋放,因此 ptr.use_count() 打印 0.

可以運(yùn)行下面代碼驗(yàn)證:

#include<memory>
#include<cstdio>
#include<map>
using namespace std;
int main() {
    shared_ptr<int> ptr = make_shared<int>(100);
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    map<int, shared_ptr<int>> mp;
    mp.insert(pair<int, shared_ptr<int>>(1, ptr));
    mp.insert(pair<int, shared_ptr<int>>(2, ptr));
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    ptr.reset();
    printf("count=%ld\n", ptr.use_count());
    printf("=%d,count=%ld\n", *mp[1].get(), mp[1].use_count());
    printf("=%d,count=%ld\n", *mp[2].get(), mp[2].use_count());
    return 0;
}

輸出:

=100,count=1
=100,count=3
count=0
=100,count=2
=100,count=2

函數(shù)邏輯

你可以設(shè)想一下這個(gè)函數(shù)的邏輯

void reset() _NOEXCEPT
    {
        shared_ptr().swap(*this);
    }

第一步, 創(chuàng)造一個(gè)空shared_ptr對(duì)象,與原智能指針交換.交換后指向nullptr,引用為0;

第二步, 原始的指針成了右值, 在語(yǔ)句調(diào)用結(jié)束消滅, 隨即, 原資源引用數(shù)減一, 如減為0, 自行消滅,否則繼續(xù)留存.

 以上就是解析C語(yǔ)言中智能指針引用計(jì)數(shù)為什么不是0原理的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言智能指針引用計(jì)數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

古交市| 阿尔山市| 昌图县| 武安市| 靖西县| 安泽县| 新安县| 福鼎市| 龙江县| 河北省| 邢台市| 开封县| 崇义县| 星座| 丁青县| 合阳县| 洛宁县| 民勤县| 衡阳县| 方正县| 金昌市| 西峡县| 台南市| 泉州市| 莆田市| 福鼎市| 庄河市| 上栗县| 高安市| 新和县| 梨树县| 安图县| 乐亭县| 通化县| 屏东市| 扎赉特旗| 阜宁县| 惠安县| 晋宁县| 昭平县| 隆德县|