C++?shared_ptr智能指針reset()使用示例詳解
C++ shared_ptr智能指針 reset() 詳解
最近看了個(gè)問(wèn)題:智能指針引用計(jì)數(shù)為什么不是0?, 問(wèn)將智能指針reset后為何不是引用減一.
代碼說(shuō)明
#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ǔ)義
通過(guò)源碼可能比較好理解:
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é)
上面的問(wèn)題, 其實(shí)是沒有掌握智能指針的成員函數(shù)的確切語(yǔ)義, 當(dāng)然, 原因可能很復(fù)雜, 比如教材就說(shuō)不明白, 或者望文生義, 沒仔細(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語(yǔ)言字符函數(shù)isalnum()和iscntrl()詳解
C語(yǔ)言復(fù)數(shù)的加減及輸出結(jié)構(gòu)體
C++實(shí)現(xiàn)正整數(shù)的四則運(yùn)算表達(dá)式
C++11 <future>中std::promise 介紹

