C++?shared_ptr智能指針reset()使用示例詳解
C++ shared_ptr智能指針 reset() 詳解
最近看了個問題:智能指針引用計數(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ù)的語義
通過源碼可能比較好理解:
void reset() _NOEXCEPT
{
shared_ptr().swap(*this);
}這是reset()的實現(xiàn), 用shared_ptr()調(diào)用構(gòu)造一個臨時指針, 并將其與調(diào)用reset()的指針對象(上例中的ptr)進行交換, 原對象指向的資源變?yōu)閚ullptr, 引用計數(shù)變?yōu)?.
臨時對象指向原指針指向的資源(上例中的100), 引用計數(shù)變?yōu)?(臨時對象, second, third), 語句結(jié)束, 臨時對象析構(gòu), 引用計數(shù)減一.
總結(jié)
上面的問題, 其實是沒有掌握智能指針的成員函數(shù)的確切語義, 當然, 原因可能很復雜, 比如教材就說不明白, 或者望文生義, 沒仔細看解釋.
可能這也提醒我們, 對于標準庫文檔要比較熟悉, 對拿不準的看下源碼, 或者做些簡單測試 然后再進行使用.
以上就是C++ shared_ptr智能指針reset()使用示例詳解的詳細內(nèi)容,更多關(guān)于C++ shared_ptr智能指針reset的資料請關(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ù),編譯時C++編譯器會在調(diào)用的地方展開內(nèi)聯(lián)函數(shù)**,這樣調(diào)用內(nèi)聯(lián)函數(shù)就需要創(chuàng)建棧楨,就提高效率了,這篇文章給大家介紹C++ 內(nèi)聯(lián)函數(shù)inline|nullptr的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧2024-07-07
C++利用inotify+epoll實現(xiàn)異步文件監(jiān)控的方法
這篇文章講給大家詳細介紹一下C++利用inotify+epoll實現(xiàn)異步文件監(jiān)控的方法,inotify是一種異步文件監(jiān)控機制,文章通過代碼示例介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下2023-08-08
C++超詳細講解隱藏私有屬性和方法的兩種實現(xiàn)方式
為了避免因為將類庫中的私有成員開放給類的使用方而導致的軟件邏輯外泄,因此需要將對外代碼中的私有成員隱藏起來,下面我們來了解一下隱藏私有屬性和方法的兩種實現(xiàn)方式2022-05-05

