C++?shared_ptr智能指針reset()使用示例詳解
C++ shared_ptr智能指針 reset() 詳解
最近看了個(gè)問題:智能指針引用計(jì)數(shù)為什么不是0?, 問將智能指針reset后為何不是引用減一.
代碼說明
#include <cstdio> #include <memory> auto main() -> int { std::shared_ptr<int> ptr = std::make_shared<int>(100); auto second = ptr; auto third = ptr; printf("num = %d, count = %ld\n", *ptr, ptr.use_count()); ptr.reset(); printf("ptr count = %ld\n", ptr.use_count()); printf("second and third count = %ld\n", second.use_count()); return 0; }
ptr調(diào)用reset后, 引用數(shù)為0, 而不是2.
reset()函數(shù)的語(yǔ)義
通過源碼可能比較好理解:
void reset() _NOEXCEPT { shared_ptr().swap(*this); }
這是reset()的實(shí)現(xiàn), 用shared_ptr()調(diào)用構(gòu)造一個(gè)臨時(shí)指針, 并將其與調(diào)用reset()的指針對(duì)象(上例中的ptr)進(jìn)行交換, 原對(duì)象指向的資源變?yōu)閚ullptr, 引用計(jì)數(shù)變?yōu)?.
臨時(shí)對(duì)象指向原指針指向的資源(上例中的100), 引用計(jì)數(shù)變?yōu)?(臨時(shí)對(duì)象, second, third), 語(yǔ)句結(jié)束, 臨時(shí)對(duì)象析構(gòu), 引用計(jì)數(shù)減一.
總結(jié)
上面的問題, 其實(shí)是沒有掌握智能指針的成員函數(shù)的確切語(yǔ)義, 當(dāng)然, 原因可能很復(fù)雜, 比如教材就說不明白, 或者望文生義, 沒仔細(xì)看解釋.
可能這也提醒我們, 對(duì)于標(biāo)準(zhǔn)庫(kù)文檔要比較熟悉, 對(duì)拿不準(zhǔn)的看下源碼, 或者做些簡(jiǎn)單測(cè)試 然后再進(jìn)行使用.
以上就是C++ shared_ptr智能指針reset()使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C++ shared_ptr智能指針reset的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
深入解讀C++ 內(nèi)聯(lián)函數(shù)inline|nullptr
內(nèi)聯(lián)函數(shù):用** inline 修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù),編譯時(shí)C++編譯器會(huì)在調(diào)用的地方展開內(nèi)聯(lián)函數(shù)**,這樣調(diào)用內(nèi)聯(lián)函數(shù)就需要?jiǎng)?chuàng)建棧楨,就提高效率了,這篇文章給大家介紹C++ 內(nèi)聯(lián)函數(shù)inline|nullptr的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧2024-07-07C++利用inotify+epoll實(shí)現(xiàn)異步文件監(jiān)控的方法
這篇文章講給大家詳細(xì)介紹一下C++利用inotify+epoll實(shí)現(xiàn)異步文件監(jiān)控的方法,inotify是一種異步文件監(jiān)控機(jī)制,文章通過代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-08-08C語(yǔ)言 語(yǔ)義陷阱超詳細(xì)梳理總結(jié)
這篇文章主要介紹了C語(yǔ)言常見的一些語(yǔ)義陷阱,梳理的比較全面,對(duì)我們做開發(fā)的過程中有一定幫助,感興趣的朋友快來看看吧2022-03-03C語(yǔ)言小游戲之簡(jiǎn)易版三子棋(棋盤可自由擴(kuò)展)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)三子棋游戲,還可以自由擴(kuò)展棋盤大小,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單計(jì)算器
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05C++超詳細(xì)講解隱藏私有屬性和方法的兩種實(shí)現(xiàn)方式
為了避免因?yàn)閷㈩悗?kù)中的私有成員開放給類的使用方而導(dǎo)致的軟件邏輯外泄,因此需要將對(duì)外代碼中的私有成員隱藏起來,下面我們來了解一下隱藏私有屬性和方法的兩種實(shí)現(xiàn)方式2022-05-05C語(yǔ)言實(shí)現(xiàn)找出二叉樹中某個(gè)值的所有路徑的方法
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)找出二叉樹中某個(gè)值的所有路徑的方法,針對(duì)數(shù)據(jù)結(jié)構(gòu)中二叉樹的實(shí)用操作技巧,需要的朋友可以參考下2014-09-09