C++智能指針的設計和使用
對于一個C++的使用者來說,指針的使用可以算的上是家常便飯,但是在使用的過程中,很多時候可能會因為new或者malloc了一個對象,而忘記最后結束的時候去釋放掉(我就會犯這樣子的錯誤),從而導致內存泄露。而此時智能指針可能可以幫助我去解決這個問題。
智能指針(smart pointer)是利用個引用計數的策略去處理指針的釋放,從而保證指針的安全性。通常情況下,我們會自己去設計一個智能指針類去管理自己的指針對象。其 實其原理是存儲指向動態分配的指針對象類,通過引用計數的功能去控制,去正確的實現指針對象的銷毀,從而避免內存泄露。
智能指針的原理是,通過將指針類和一個引用計數關聯起來,而引用計數 計算,當前指針被多少個對象所共享。 每次創建一個新的指針對象的時候,初始化指針并將引用計數置為1;當對象作為另一個對象的副本而被創建的時候,拷貝構造函數拷貝指針并增加與之對應的引用 計數。對于一個對象進行賦值時,賦值操作符減少左操作數所指對象的引用計數(如果引用計數為減至0,則刪除對象),并且增加右操作數所指對象的引用計數; 調用析構函數時,構造函數減少引用計數(如果引用計數減至0,刪除基礎對象)。
下面的代碼主要是借鑒了百度百科的代碼來學習智能指針:
#include<iostream> #include<stdexcept> using namespace std; #define TEST_SMARTPTR class Stub { public: void print(){ cout<<"Stub:print"<<endl; } ~Stub(){ cout<<"Stub:Destructor"<<endl; } }; template<typename T> class SmartPtr { public: SmartPtr(T*p=0):ptr(p),pUse(new size_t(1)){} SmartPtr(const SmartPtr& src):ptr(src.ptr),pUse(src.pUse){ ++*pUse; } SmartPtr&operator=(const SmartPtr& rhs){ //self-assigningisalsoright ++*rhs.pUse; decrUse(); ptr=rhs.ptr; pUse=rhs.pUse; return *this; } T* operator->(){ if(ptr) return ptr; throw std::runtime_error("accessthroughNULLpointer"); } const T* operator->()const{ if(ptr) return ptr; throw std::runtime_error("accessthroughNULLpointer"); } T &operator*(){ if(ptr) return *ptr; throw std::runtime_error("dereferenceofNULLpointer"); } const T &operator*()const{ if(ptr) return *ptr; throw std::runtime_error("dereferenceofNULLpointer"); } ~SmartPtr(){ decrUse(); #ifdef TEST_SMARTPTR std::cout<<"SmartPtr:Destructor"<<std::endl;//fortesting #endif } private: void decrUse(){ if(--*pUse==0){ delete ptr; delete pUse; } } T* ptr; size_t* pUse; }; int main() { try{ SmartPtr<Stub> t; t->print(); }catch(const exception&err){ cout<<err.what()<<endl; } SmartPtr<Stub>t1(new Stub); SmartPtr<Stub>t2(t1); SmartPtr<Stub>t3(new Stub); t3=t2; t1->print(); (*t3).print(); return 0; }在面的代碼中,智能指針一般都會去重載->和*操作符,從而使其表現指針的表象,并且大家可以使用它像使用指針一樣。 在函數析構的時候,我們會發現引用計數在其中所起到的作用,從而避免誤操作早成指針提前釋放,造成指針懸掛,或者釋放不徹底,造成內存泄漏的問題。
來自:http://blog.csdn.net/haitunxiaomo/article/details/42042345
本文由用戶 碼頭工人 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!