智能指針的三種常見寫法:
創(chuàng)新互聯(lián)公司是一家專業(yè)提供科爾沁左翼企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計、做網(wǎng)站、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為科爾沁左翼眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。
一、最開始的原始寫法,原始寫法可以理解為指針轉(zhuǎn)移的方法。
template<typename T> class AutoPtr { public: AutoPtr() :_ptr(NULL) {} AutoPtr(T* ptr) :_ptr(ptr) {} ~AutoPtr() { if (_ptr) { delete _ptr; _ptr = NULL; } } AutoPtr<T>(AutoPtr<T>& ap) : _ptr(ap._ptr) { ap._ptr = NULL; } AutoPtr<T>& operator = (AutoPtr<T>& ap) { if (this != &ap) { delete _ptr; _ptr = ap._ptr; ap._ptr = NULL; } return *this; } T& operator*() { return *_ptr; } T* GerPtr() { return _ptr; } private: T* _ptr; };
二、演變?yōu)楹髞淼膕coped寫法,又可以稱作守衛(wèi)寫法。該寫法相對于原始寫法的優(yōu)點在于不讓使用拷貝構(gòu)造和運算符的重載,這樣就避免了深淺拷貝的指針問題。做法是把拷貝構(gòu)造、運算符的重載定聲明出來而不定義,并且用protected保護起來。scoped寫法是引用的boost庫。有興趣的可以去了解一下這個東西,背后還是有很多故事的,在這我就不多說啦。
template<class T> class scopedPtr { public: scopedPtr() :_ptr(NULL) {} scopedPtr(T* ptr) :_ptr(ptr) {} ~scopedPtr() { if (_ptr) { delete _ptr; _ptr = NULL; } } T& operator*() { return *_ptr; } T* operator->() { return _ptr; } T* GetPtr() { return _ptr; } protected: //加上protected可以防止使用者在類之外定義拷貝構(gòu)造和運算符的重載函數(shù) scopedPtr<T>(const scopedPtr<T>& sp); //不讓使用者使用拷貝,可以防止拷貝,所以只聲明不定義 scopedPtr<T>& operator=(const scopedPtr<T>& sp); private: T* _ptr; };
三、sharedPtr寫法
這種方法考慮了深淺拷貝問題并且引用了引用計數(shù)器來解決淺拷貝的問題,比較完善的實現(xiàn)了智能指針想要實現(xiàn)的功能。
template<class T> class SharePtr { public: SharePtr(T* ptr) :_ptr(ptr) , _pCount(new int(1)) {} //SharePtr(Shar) // :_ptr(sp._ptr) //{ // *_pCount = 1; //} ~SharePtr() { if (_ptr) { if (--(*_pCount) == 0) { delete _ptr; delete _pCount; _ptr = NULL; _pCount = NULL; } _ptr = NULL; } } SharePtr<T>(const SharePtr<T>& sp) { _ptr = sp._ptr; _pCount = sp._pCount; ++(*_pCount); } SharePtr<T>& operator=(const SharePtr<T>& sp) { if (this != &sp) { if (--(*_pCount) == 0) //這里要分清楚是誰減一,邏輯需要分析清楚 { delete _ptr; delete _pCount; _ptr = NULL; _pCount = NULL; } _ptr = sp._ptr; _pCount = sp._pCount; ++(*_pCount); } return *this; } private: T* _ptr; int* _pCount; };
網(wǎng)站名稱:【C++】智能指針的原始寫法、scoped寫法、shared寫法
轉(zhuǎn)載來于:http://www.rwnh.cn/article8/jepgop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計、網(wǎng)站排名、云服務(wù)器、企業(yè)網(wǎng)站制作、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)