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...