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

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

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

問題示例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 // 為什么這里引用計數(shù)是1而不是0呢?

問題示例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()是引用計數(shù)減1.

解析

問題1:

ptr 還在,還有一個引用。

問題2:

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

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

可以運行下面代碼驗證:

#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è)想一下這個函數(shù)的邏輯

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

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

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

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

相關(guān)文章

  • OpenCV獲取圖像中直線上的數(shù)據(jù)具體流程

    OpenCV獲取圖像中直線上的數(shù)據(jù)具體流程

    對圖像進行處理時,經(jīng)常會有這類需求:客戶想要提取出圖像中某條直線或者ROI區(qū)域內(nèi)的感興趣數(shù)據(jù),進行重點關(guān)注,怎么操作呢,下面小編通過實例代碼介紹下OpenCV獲取圖像中直線上的數(shù)據(jù),一起看看吧
    2021-11-11
  • C語言實現(xiàn)單詞小助手

    C語言實現(xiàn)單詞小助手

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)單詞小助手,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C語言中獲取文件狀態(tài)的相關(guān)函數(shù)小結(jié)

    C語言中獲取文件狀態(tài)的相關(guān)函數(shù)小結(jié)

    這篇文章主要介紹了C語言中獲取文件狀態(tài)的相關(guān)函數(shù)小結(jié),包括stat()函數(shù)和fstat()函數(shù)以及l(fā)stat()函數(shù)的使用,需要的朋友可以參考下
    2015-09-09
  • 基于OpenCV實現(xiàn)圖像分割

    基于OpenCV實現(xiàn)圖像分割

    這篇文章主要為大家詳細介紹了基于OpenCV實現(xiàn)圖像分割,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++ 自由存儲區(qū)是否等價于堆你知道嗎

    C++ 自由存儲區(qū)是否等價于堆你知道嗎

    自由存儲是C++中通過new與delete動態(tài)分配和釋放對象的抽象概念,而堆(heap)是C語言和操作系統(tǒng)的術(shù)語,是操作系統(tǒng)維護的一塊動態(tài)分配內(nèi)存
    2021-08-08
  • C++ 強制類型轉(zhuǎn)換詳解

    C++ 強制類型轉(zhuǎn)換詳解

    這篇文章主要介紹的是C++ 強制類型轉(zhuǎn)換詳解,C語言中的強制轉(zhuǎn)換主要用于普通數(shù)據(jù)類型、指針的強制轉(zhuǎn)換,沒有類型檢查,轉(zhuǎn)換不安全,下面我們來看看其具體語法及詳細內(nèi)容
    2021-11-11
  • 基于Turbo C(V2.0)編譯錯誤信息的詳細介紹

    基于Turbo C(V2.0)編譯錯誤信息的詳細介紹

    本篇文章對Turbo C(V2.0)編譯的錯誤信息進行了詳細的介紹。需要的朋友參考下
    2013-05-05
  • C++你最好不要做的幾點小結(jié)

    C++你最好不要做的幾點小結(jié)

    整理如下,主要是方便剛開始接觸c++的朋友
    2013-01-01
  • C語言之實現(xiàn)輾轉(zhuǎn)相除法的兩種方式

    C語言之實現(xiàn)輾轉(zhuǎn)相除法的兩種方式

    這篇文章主要介紹了C語言之實現(xiàn)輾轉(zhuǎn)相除法的兩種方式,具有很好的參考價值,希望對大家有所幫助,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++流程控制中用于跳轉(zhuǎn)的return和goto語句學習教程

    C++流程控制中用于跳轉(zhuǎn)的return和goto語句學習教程

    這篇文章主要介紹了C++流程控制中用于跳轉(zhuǎn)的return和goto語句學習教程,是C++入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01

最新評論

开鲁县| 成安县| 德化县| 闻喜县| 敦化市| 屏南县| 沅江市| 江陵县| 四川省| 辉县市| 湛江市| 西乌珠穆沁旗| 平塘县| 鹤壁市| 利川市| 烟台市| 通道| 姚安县| 长岛县| 乐山市| 孟连| 柞水县| 宁南县| 青浦区| 秭归县| 元谋县| 福海县| 洮南市| 巴东县| 台江县| 威信县| 乐安县| 合水县| 嘉定区| 松江区| 通化市| 大庆市| 来凤县| 全南县| 石台县| 滁州市|