C 智慧型指標(一) auto ptr

2021-09-10 15:42:17 字數 3062 閱讀 9464

其中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中引入了智慧型指標的概念,方便管理堆記憶體。棧 堆區別 棧 系統開闢 系統釋放 堆 手動開闢 手動釋放 設計 ...