auto_ptr 智慧指標

licup123發表於2009-01-08
       auto_ptr是現在標準庫裡面一個輕量級的智慧指標的實現,存在於標頭檔案 memory中,之所以說它是輕量級,是因為它只有一個成員變數(擁有物件的指標),相關的呼叫開銷也非常小。
void g()     
 {
T* pt1 = new T;
    //
 right now, we own the allocated object
    // pass ownership to an auto_ptr

    auto_ptr<T> pt2( pt1 );
    //
 use the auto_ptr the same way
    // we'd use a simple pointer

    *pt2 = 12;       // same as "*pt1 = 12;"

    pt2
->SomeFunc(); // same as "pt1->SomeFunc();"
   
// use get() to see the pointer value

    assert( pt1 == pt2.get() );
   
// use release() to take back ownership

    T* pt3 = pt2.release();
   
//
 delete the object ourselves, since now
   
// no auto_ptr owns it any more

     delete pt3;
}
void h()
{
    auto_ptr
<T> pt( new T(1
) );
    pt.reset( 
new T(2
) );
    
//
 deletes the first T that was
    
// allocated with "new T(1)"


}
 // finally, pt goes out of scope and
}
從上面的例子來看,auto_ptr的使用很簡單,通過建構函式擁有一個動態分配物件的所有權,然後就可以被當作物件指標來使用,當auto_ptr物件被銷燬的時候,它也會自動銷燬自己擁有所有權的物件(嗯,標準的RAAI做法),release可以用來手動放棄所有權,reset可用於手動銷燬內部物件。
 
auto_ptr的物件所有權是獨佔性的
       這決定了不可能有兩個auto_ptr物件同時擁有同一動態物件的所有權,從而也導致了auto_ptr的拷貝行為是非對等的,其中伴隨著物件所有權的轉移。
      我們仔細觀察auto_ptr的原始碼就會發現拷貝構造和賦值操作符所接受的引數型別都是非const的引用型別(auto_ptr<_Ty>& ),而不是我們一般應該使用的const引用型別
     拷貝過程中被拷貝的物件(_Right)都會被呼叫release來放棄所包括的動態物件的所有權,動態物件的所有權被轉移了,新的auto_ptr獨佔了動態物件的所有權。也就是說被拷貝物件在拷貝過程中會被修改,拷貝物與被拷貝物之間是非等價的。這意味著如下的程式碼是錯誤的
     同時也不要將auto_ptr放進標準庫的容器中,否則在標準庫容器無準備的拷貝行為中(標準庫容器需要的拷貝行為是等價的),會導致難以發覺的錯誤
       auto_ptr特殊的拷貝行為使得使用它來遠距離傳遞動態物件變成了一件十分危險的行為,在傳遞的過程中,一不小心就會留下一些實際為空但程式本身卻缺少這樣認知的auto_ptr物件
       簡單的說來,auto_ptr適合用來管理生命週期比較短或者不會被遠距離傳遞的動態物件,使用auto_ptr來管理動態分配物件,最好是侷限於某個函式內部或者是某個類的內部。也就是說,動態物件的產生,使用和銷燬的全過程是處於一個小的受控的範圍,而不會在其中加入一些適應未來時態的擴充套件。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10697500/viewspace-531785/,如需轉載,請註明出處,否則將追究法律責任。

相關文章