auto ptr模板類 智慧型指標

2021-09-30 05:40:36 字數 2184 閱讀 1257

auto_ptr模板類

auto_ptr模板定義了類似指標的物件,可以將new獲得(直接或間接)的位址賦給這種物件。當auto_ptr物件過期時,其析構函式將使用delete來釋放記憶體。

要建立auto_ptr物件,必須包含標頭檔案memory。使用通常的模板句法來例項化所需型別的指標。模板中包括:

template

class auto_ptr;

throw()意味著建構函式不引發異常。因此,請求x型別的auto_ptr將獲得乙個指向x型別的auto_ptr:

auto_ptrpd(new double);

// an auto_ptr to double

// (use in place of double *)

auto_ptrps(new string);

// an auto_ptr to string

// (use in place of string *)

上述中new double是new返回的指標,指向新分配的記憶體塊。它是auto_ptr建構函式的引數,即它是對應於原型中形參 x* p 的實參。

範例:#include

void remodel (string & str)

auto_ptr的建構函式是顯示的,因此不存在從指標到auto_ptr物件的隱式型別轉換:

auto_ptrpd;

double *p_reg = new double;

pd = p_reg;                                       // not allowed(implicit conversion)

pd = auto_ptr(p_reg);      // allowed(explicit conversion)

auto_ptrpauto = p_reg;   // not allowed(implicit conversion)

auto_ptrpauto (p_reg);

// allowed(explicit conversion)

auto_ptr是一種智慧型指標(smart pointer)——類似於指標,但特性比指標更多。

auto_ptr類被定義為在很多方面與常規指標類似。例如,如果ps是乙個auto_ptr,則可以對它執行解除引用操作(*ps)和遞增操作(++ps),用它來訪問結構成員(ps->puffindex),將它賦給指向相同型別的常規指標。還可以將auto_ptr賦給另乙個同型別的auto_ptr,但將引發乙個問題,請看下面「auto_ptr賦值問題」。

auto_ptr的注意事項

由於auto_ptr模板使用的是delete,因此它只能與new一起使用:

auto_ptrpi (new int[200]); 

//no

這將引發錯誤。

可以複製標頭檔案memory中的auto_ptr模板,然後對其進行修改,使之使用delete。

下述**將delete操作符用於非堆記憶體,而引發錯誤:

string vacation("i wandered lonely as a cloud.");

auto_ptrpvac (&vacation);

//no

警告: 只能對new分配的記憶體使用auto_ptr物件,而不要對由new分配的或者通過宣告變數分配的記憶體使用它。

auto_ptr賦值問題

auto_ptrps (new string("i reigned lonely as a cloud.") );

auto_ptrvocation;

vocation = ps;

兩個指標將指向同乙個string物件,其中乙個是另乙個的拷貝。當ps和vocation都過期時,程式將試圖刪除同乙個物件兩次。

解決辦法:

(1) 定義賦值操作符,使之執行深度複製。這樣兩個指標將指向不同的物件,其中的乙個物件是另乙個物件的拷貝。

(2) 建立所有權(ownership)概念,對於特定的物件,只能有乙個智慧型指標可擁有它。智慧型指標的建構函式只能刪除該智慧型指標擁有的物件。並使賦值操作轉讓所有權。這就是用於auto_ptr的策略。

(3) 建立智慧型更高的指標,跟蹤引用特定物件的智慧型指標數。這被稱為引用計數(reference counting)。例如,賦值時,計數器加1;指標過期時,計數將減1。僅當最後乙個指標過期時,delete才被呼叫。

(同樣的策略也適用於複製建構函式)

auto ptr智慧型指標

1 class auto ptr 這個智慧型指標應該保證,無論在何種情形下,只要自己被摧毀,就一定連帶釋放其所指資源。而由於智慧型指標本身就是區域變數,所以無論是正常退出,還是異常退出,只要函式退出,它就一定會被銷毀。注意 auto ptr不允許使用一般指標慣用的賦值 assign 初始化方式。必須...

智慧型指標 AutoPtr

include include include using namespace std void func autoptr 析構函式來負責釋放 void test catch exception e autoptr 析構函式來負責釋放 private t ptr struct aa void fun...

stl智慧型指標auto ptr

感覺auto ptr還是存在一些不足的,效率十分低,而且丟失了一般指標方便常用的操作,如 等,auto ptr只過載了 這幾個操作符,所以使用很不方便。一 說明 int a null delete a do nothing 應此auto ptr的析構函式是這樣子的 auto ptr 二 auto p...