筆記 2 智慧型指標

2021-09-25 07:20:51 字數 1387 閱讀 5332

原生指標是一款很強大的工具,但是依據進數十年的經驗,可以確定的一點是:稍有不慎,這 個工具就會反噬它的使用者。

c++11標準中規定了四個智慧型指標:

std::auto_ptr,std::unique_ptr,std::shared_ptr,std::weak_ptr.他們都是用來輔助管理動態分配物件的宣告週期。

當要使用乙個智慧型指標的時候,首先要想到的應該是std::unique_ptr。預設情況下,std::unique_ptr和原生指標同等大小,對於大多數操作,他們執行的底層指令也一樣。

std::unique_ptr具現了獨佔語義,乙個非空的std::unique_ptr永遠擁有它指向的物件。

很容易將乙個std::unique_ptr轉化為std::shared_ptr.

std::unique_ptrgetwidget();

std::shared_ptrpwidget = getwidget();

std::shared_ptr通過引用計數來管理物件的生命週期。std::shared_ptr的建構函式自動遞增這個計數,析構函式自動遞減這個計數。如果std::shared_ptr在執行減一後發現引用計數變成了0,說明沒有其他的std::shared_ptr在指向這個資源了,所以std::shared_ptr直接析構了它指向的空間。

std::shared_ptr是std::unique_ptr的兩倍大,除了控制塊,還有需要原子引用計數操作引起的開銷

避免從原生指標型別變數建立std::shared_ptr,若無法避免,請使用new

auto pw = new widget;

std::shared_ptrspw1(pw);

std::shared_ptrspw2(pw); // 到此為止,為pw建立了兩個智慧型指標,且其計數都分別為1,當進行釋放時,第一次析構沒有問題,第二次析構時pw已經不存在了,這就產生了乙個未定義行為

std::shared_ptr spw1(new widget); // 直接使用new

std::shared_ptr spw2(spw1); // 這樣就沒有問題了

std::weak_ptr不能被單獨使用,它是std::shared_ptr作為引數的產物。std::weak_ptr通常有乙個std::shared_ptr來建立,他們指向相同位址,std::shared_ptr來初始化他們,但是std::weak_ptr不會影響到它所指物件的引用計數。

auto spw = std::make_shared();

std::weak_ptrwpw(spw);

spw = nullptr;

if (wpw.expired())

2 智慧型指標

為什麼需要智慧型指標?乙個類庫的產生勢必有其被觸發的動機,正如某句經典語所云 在這個世界上,沒有無緣無故的愛,也沒有無緣無故的恨。同樣的,在c 世界裡,也不是無緣無故的出現智慧型指標。搞清楚智慧型指標的設計動機,對於正確的理解智慧型指標工作原理 設計思想 以及適用場合是有著非常直接的幫助。所以,讓我...

智慧型指標 2

一 指標指標能做什麼 在編寫c 程式的時候,讓我們最頭痛的問題就是記憶體洩露,也就是說 int pt new int delete pt 必須保證new和delete必須成對出現。作為程式設計師,我們最理想的指標,是可以像使用普通變數一樣來使用的指標,這個指標可以在恰當的時候被自動釋放。智慧型指標就...

智慧型指標筆記

前言智慧型指標是行為類似於指標的類物件。include include using namespace std void fun string str int main system pause return0 void fun string str 可以看出此 中有缺陷,在fun函式中,分配了堆中...