c++ 智能指針

auto_ptr:
auto_ptr存在隱式的所有權轉換,在c11的標準中使用新的智能指針來代替。不能用於管理動態分配的數組,被複制和賦值時也會發生所有權轉換,也就不能用於標準容器器類型之中,在c11中可以使用其它的方式代替。
使用auto_ptr常見的有兩種場景,一是作爲智能指針傳遞到產生auto_ptr的函數外部,二是使用auto_ptr作爲RAII管理類,在超出auto_ptr的生命週期時自動釋放資源。
對於第1種場景,可以使用boost::shared_ptr或者是std::tr1::shared_ptr(在C++11標準中是std::shared_ptr)來代替。
對於第2種場景,可以使用boost::scoped_ptr或者C++11標準中的std::unique_ptr來代替。其中std::unique_ptr是std::auto_ptr的代替品,支持顯式的所有權轉移

shared_ptr:
shared_ptr的作用有如同指針,但會記錄有多少個shared_ptrs共同指向一個對象。這便是所謂的引用計數(reference counting)。一旦最後一個這樣的指針被銷燬,也就是一旦某個對象的引用計數變爲0,這個對象會被自動刪除。這在非環形數據結構中防止資源泄露很有幫助。

weak_ptr:
weak_ptr是爲配合shared_ptr而引入的一種智能指針來協助shared_ptr工作,它可以從一個shared_ptr或另一個weak_ptr對象構造,它的構造和析構不會引起引用記數的增加或減少。沒有重載*和->但可以使用lock獲得一個可用的shared_ptr對象
weak_ptr的一個重要用途是通過lock獲得this指針的shared_ptr,使對象自己能夠生產shared_ptr來管理自己,但助手類enable_shared_from_this的shared_from_this會返回this的shared_ptr,只需要讓想被shared_ptr管理的類從它繼承即可

unique_ptr:
unique_ptr它持有對對象的獨有權——兩個unique_ptr不能指向一個對象,不能進行復制操作只能進行移動操作。unique_ptr在超出作用域,即以下情況時它指向的對象會被摧毀:
unique_ptr指向的對象被破壞對象通過operator=()或reset()被指定到另一個指針)
unique_ptr還可能沒有對象,這種情況被譽爲empty。
例如:
std::unique_ptr<int>p1(newint(5));
std::unique_ptr<int>p2=p1;// 編譯會出錯
std::unique_ptr<int>p3=std::move(p1);// 轉移所有權, 現在那塊內存歸p3所有, p1成爲無效的針.
p3.reset();//釋放內存.
p1.reset();//實際上什麼都沒做.

allocator
allocator類是C++的一個模板,它提供類型化的內存分配以及對象的分配和撤銷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章