C++11的智能指針是繼可變模板參數(shù)彤蔽,右值引用與移動語義以后又一個非常強大的特性。由于C++是沒有GC的語言捂贿,程序員需要自己去管理堆上分配的內(nèi)存渤弛。智能指針在我的理解看來實現(xiàn)了部分GC的功能泛释,本質(zhì)還是使用的引用計數(shù)滤愕。當RC變到0的時候自動釋放相關(guān)內(nèi)存。本質(zhì)是對一個裸指針進行了封裝加上了引用計數(shù)罷了怜校。智能指針有四種(其實C++11引入的是三種)unique_ptr shared_ptr weak_ptr和基本被廢棄的auto_ptr间影。下面就針對不同種類的智能指針展開記錄。// TODO enable_shared_from_this
unique_ptr
顧名思義對象是unique的茄茁,同一時間只有一個智能指針持有對應(yīng)的對象魂贬。因此unique_ptr delete了賦值與拷貝構(gòu)造,只有移動構(gòu)造裙顽。unique_ptr生命周期結(jié)束后就會調(diào)用里面裸指針指向的對象的deleter随橘,默認是析構(gòu)函數(shù),也可以在創(chuàng)建unique_ptr的時候指定你想要的deleter锦庸。
shared_ptr
也是顧名思義,可以有多個shared_ptr指向同一個對象蒲祈,只有在shared_ptr的RC為0的時候才會調(diào)用deleter甘萧。可以復(fù)制和拷貝梆掸。會對應(yīng)的改變RC的值扬卷。
weak_ptr
這個指針存在的意義主要是為了解決兩個對象互相持有對方的shared_ptr形成循環(huán)引用帶來的內(nèi)存泄漏 (A 持有 B的shared_ptr, B 持有 A的shared_ptr, RC永遠不為0)酸钦。當使用weak_ptr的時候不會增加shared_ptr的RC怪得,增加的是weak_ptr 的weak_RC。與unique_ptr和shared_ptr不同的是weak_ptr是不支持解引用的(因為指向的對象可能已經(jīng)不存在了),需要調(diào)用lock方法返回對應(yīng)的shared_ptr徒恋,如果shared_ptr不為空說明對象仍然存在才可以使用指向的對象蚕断。
鑒于現(xiàn)在有些公司面試還要手寫智能指針,這里就研究一下智能指針的源碼寫一個demo出來入挣。在這里我們寫一個shared_ptr的demo亿乳。
首先我們先研究一下C++標準里咋寫的這個玩意兒。這里截圖用的xcode的llvm的libc++径筏。
我們先看一下標準庫里的shared_ptr到底存了啥葛假。看一下他的成員變量滋恬。
主要是兩個聊训,第一個是智能指針包的裸指針,第二個是指向存儲strong RC和weak RC值的一個結(jié)構(gòu)體恢氯。再看看那個記錄了RC的結(jié)構(gòu)體里到底放了啥带斑。
其實里面存的就是一個shared_ptr的strong ref和weak ref。有一點值得注意的是我們看源碼可以看到里面對strong和weak的引用計數(shù)都是atomic的酿雪。因此在引用計數(shù)這個方面智能指針是線程安全的遏暴。但是你操作指針指向的對象的時候不是線程安全的哦。(待續(xù))
現(xiàn)在我們知道了libc++中智能指針的實現(xiàn)方式指黎∨罅梗回想一下智能指針的需求我們實現(xiàn)起來大概就有思路了。首先持有一個裸指針和一個記錄RC的結(jié)構(gòu)體指針醋安。在賦值和析構(gòu)的時候?qū)C結(jié)構(gòu)體里的數(shù)據(jù)進行修改即可杂彭。(待續(xù))