其中shared_ptr和scoped_ptr的應用範圍更大一些。在單例中,shared_ptr比較好用。
用來託管自定義型別物件,讓在堆上建立的自定義物件可以自動釋放
通過寫乙個智慧型指標類,通過智慧型指標類來建立自定義類的物件。在棧上建立智慧型指標物件,這樣,智慧型指標物件被釋放的時候,就把利用智慧型指標在堆上建立的自定義物件給一併析構了。
為了讓智慧型指標和指向自定義類型別指標的功能一樣,需要過載->和*.
智慧型指標的例子如下:
#define _crt_secure_no_warnings
#includeusing namespace std;
class person
void showage()
~person()
int m_age;
};//智慧型指標
//用來託管自定義型別的物件,讓物件進行自動的釋放
class smartpointer
//過載->讓智慧型指標物件 想person *p一樣去使用
person * operator->()
//過載 *
person& operator*()
~smartpointer()
}private:
person * person;
};void test01()
int main()
auto_ptr是c++標準庫中(
智慧型指標的目的是實現資源的管理,有三種方法來進行資源的管理
使用auto_ptr作為成員變數,以避免資源洩漏。
為了防止資源洩漏,我們通常在建構函式中申請,析構函式中釋放,但是只有構造函式呼叫成功,析構函式才會被呼叫,換句話說,如果在建構函式中產生了異常,那麼析構函式將不會呼叫,這樣就會造成資源洩漏的隱患。
比如,如果該類有2個成員變數,指向兩個資源,在建構函式中申請資源a成功,但申請資源b失敗,則建構函式失敗,那麼析構函式不會被呼叫,那麼資源a則洩漏。
為了解決這個問題,我們可以利用auto_ptr取代普通指標作為成員變數,這樣首先呼叫成功的成員變數的建構函式肯定會呼叫其析構函式,那麼就可以避免資源洩漏問題
auto_ptr是乙個模板類,定義如下:
template class auto_ptr ;它儲存的是乙個指向type的指標。
顧名思義,auto_ptr是一種智慧型指標,它包含乙個動態分配記憶體的指標,並在它生命週期結束的時候,銷毀包含的指標所指向的記憶體。
引發記憶體洩漏的例子:
void f()
這樣的**很常見,但它有可能造成記憶體洩露。首先你用了new,你就要記得用delete,但即使你記住了用delete,還是會出問題。如果f()在執行delete pt之前,就丟擲了異常,函式返回了。那麼這個分配的物件就沒被刪除。使用auto_ptr,很優雅的解決了這些問題:
void f()
現在的**,不會洩露type型別的物件。不管是函式正常結束,還是丟擲異常結束,都會呼叫pt的析構函式,從而刪除分配的物件。
templateclass autp_ptr
//拷貝建構函式
templateauto_ptr(autp_ptr& rhs):pointee(rhs.release()){}
~auto_ptr()
//拷貝賦值函式
templateauto_ptr& operator=(auto_ptr& rhs)
t& operator*() const
t* operator->() const
t* get() const
//...
private:
t *pointee;
};
**分析:建構函式:
explicit auto_ptr(t* p=0):pointee(p){}
auto_ptrpt; //包含乙個int*的指標,並初始化為null
auto_ptrpt(new int(123)); //包含乙個int*的指標,並初始化為123的位址
auto_ptrpt = new int(123); //error! 建構函式宣告為explicit
拷貝建構函式:
template
auto_ptr(autp_ptr& rhs):pointee(rhs.release()){}
int* ptr = new int();
auto_ptrpt1(ptr); //建構函式1
auto_ptrpt2(pt1); //將pt1的使用權轉給pt2,注意pt1指向null了
//pt1呼叫了本身的release()函式,將內部指標位址傳給pt2
拷貝複製函式:
template
auto_ptr& operator=(auto_ptr& rhs) ;
class base {};
class derived : public base {};
auto_ptrpderived(new derived);
auto_ptr=pbase(pderived); //讓這樣的**能通過編譯器其本質是為了讓,
//auto_ptr類內部的derived*轉換為base*
C 智慧型指標(一) auto ptr指標
智慧型指標分為四種 1 auto ptr c 98 2 unique ptr c 11 3 shared ptr c 11 4 weak ptr c 11 本篇我們只講auto ptr指標的實現 temlpate typename t class auto ptr auto ptr t operat...
C 智慧型指標 auto ptr
智慧型指標 auto ptr vc版本 擁有權管理和轉移 當乙個智慧型指標給另乙個智慧型指標初始化的時候,兩個智慧型指標將會同時指向乙個空間,這樣在物件析構的時候,會導致一塊空間釋放多次的問題,所以乙個物件從始至終只能擁有乙個智慧型指標,這樣就保證不會乙個物件多次釋放的問題.我們讓指標給指標初始化的...
C 智慧型指標(auto ptr)
智慧型指標 在c 中使用堆記憶體是非常頻繁的操作,堆記憶體的申請和釋放都由程式設計師自己管理。使用普通指標,容易造成堆記憶體洩露,二次釋放等問題,使用智慧型指標能更好的管理堆記憶體。c 11中引入了智慧型指標的概念,方便管理堆記憶體。棧 堆區別 棧 系統開闢 系統釋放 堆 手動開闢 手動釋放 設計 ...