c 11 智慧型指標

2021-07-04 04:54:33 字數 2064 閱讀 5761

如果在程式中使用new從堆(自由儲存區)分配記憶體,等到不需要時, 應使用delete將其釋放。c++引入了智慧型指標auto_ptr, 以幫助自動完成這個過程。 c++11摒棄了auto_ptr,並新增了三種智慧型指標:unique_ptr, shared_ptr, weak_ptr。

一. auto_ptr, unique_ptr , shared_ptr

標頭檔案:  #include

用法:  auto_ptra(new double);

unique_ptrb( new int);

shared_ptrc(new string>;

#include #include #include using namespace std;

class report

~report()

void comment() const

private:

string str;

};int main()

return 0;

}

執行結果:

所有的只能指標類都有乙個explict建構函式,該建構函式可以將指標作為引數, 因此不需要自動將指標轉換為智慧型指標物件。

shared_ptrp;

double* q =  new double;

p = q; //not allowed, implicit conversion

pd = shared_ptr(q);  //ok, explict conversion

智慧型指標和常規指標類似, 也能執行 解引用操作(*p), 訪問結構成員 (p -> m_), 將它賦值給同型別的常規指標。 還可以將智慧型指標物件賦給另乙個同型別的智慧型指標物件。

智慧型指標應避免如下操作:

string str("hehe");

shared_ptra(&str);  //no!

ptr過期時,程式將把delete運算子用於非堆記憶體,這是錯誤的。

二. 

對於指向在堆分配的記憶體的指標, 指標間賦值是不能接受的,因為程式將試圖刪除同乙個物件兩次。

要避免這種問題,方法有多種:

1. 定義賦值運算子,使之執行深複製。 這樣兩個指標將指向不同物件, 其中乙個物件是另乙個的副本。 

2. 建立所有權概念, 對於特定物件, 只有乙個智慧型指標可以擁有他 ,這樣只有擁有物件的智慧型指標的建構函式會刪除物件。 然後, 讓賦值操作轉讓所有權 。 這是用於

auto_ptr 和 unique_ptr的策略, 但unique_ptr的策略更嚴格。

3. 建立智慧型更高的指標,跟蹤引用特定物件的智慧型指標數。 這稱為引用計數。 例如,賦值時, 計數加1, 指標過期時,計數減1, 僅當最後乙個指標過期時,才呼叫delete。這是shared_ptr 採用的策略。

auto_ptrp1(new string("auto");

auto_ptrp2;

p2 = p1;   //ok

p2接管p1所有權後,p1的所有權將被剝奪。 這樣可以防止p1 和 p2的析構函式試圖刪除同乙個物件 。 但如果隨後試圖使用p1, 這將是件壞事, 因為p1不在指向有效的資料。

但是如果把上面的auto_ptr換成unique_ptr,編譯器會認為 p2 = p1;這句是非法的,這樣避免了p1不在指向有效資料的問題, 因為unique_ptr比auto_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管理的類從它繼承即可。

C 11智慧型指標

本文介紹c 的四種智慧型指標,其中後三種是c 11新增加的,auto ptr已被棄用。要編譯c 11,需要安裝g 4.8 sudo add apt repository ppa ubuntu toolchain r test sudo apt get update sudo apt get inst...

c 11 智慧型指標

首先來看shared ptr,先貼一小部分vs2013裡的實現 template class shared ptr template class shared ptr public ptr base ty template explicit shared ptr ux px template cla...

C 11 智慧型指標

c 11中有unique ptr shared ptr與weak ptr等智慧型指標 smart pointer 定義在 memory 中。可以對動態資源進行管理,保證任何情況下,已構造的物件最終會銷毀,即它的析構函式最終會被呼叫。unique ptr持有對物件的獨有權,同一時刻只能有乙個uniqu...