智慧型指標 unique ptr 詳解

2021-10-19 18:05:09 字數 3612 閱讀 6237

簡單地說,c++智慧型指標是包含過載運算子的類,其行為像常規指標,但智慧型指標能夠及時、妥善地銷毀動態分配的資料,並實現了明確的物件生命週期,因此更有價值。

c++在記憶體分配、釋放和管理方面向程式猿提供了全面的靈活性。但是這種靈活性是把雙刃劍,一方面它使c++成為一種功能強大的語言,另一方面它讓程式猿能夠製造與記憶體相關的問題,比如記憶體洩漏。

例如在堆宣告和分配的記憶體,析構方法是否會自動銷毀物件,又或是方法結束後需要乙個個釋放,方法存在很多返回的地方,每個返回語句都要執行很多相關釋放操作,十分繁瑣,用智慧型指標就能實現其自動釋放。

鑑於使用常規指標存在的問題,當c++程式猿需要管理堆中的資料時,可使用智慧型指標的方式分配和管理記憶體。

智慧型指標類過載了解除引用運算子(*)和成員選擇運算子(->)。

同時為了能夠在堆中管理各種型別,幾乎所有的智慧型指標都是模板類,包含其功能的泛型實現。

unique_ptr 是從 c++ 11 開始,定義在 中的智慧型指標(smart pointer)。它持有對物件的獨有權,即兩個 unique_ptr 不能指向乙個物件,不能進行複製操作只能進行移動操作。

unique_ptr 之所以叫這個名字,是因為它智慧型指向乙個物件,即當它指向其他物件時,之前所指向的物件會被摧毀。其次,當 unique_ptr 超出作用域時,指向的物件也會被自動摧毀,幫助程式猿實現了自動釋放的功能。

unique_ptr 也可能還未指向物件,這時的狀態被稱為 empty。

std::unique_ptrp1(new int(5));

std::unique_ptrp2=p1;// 編譯會出錯

std::unique_ptrp3=std::move(p1);// 轉移所有權, 現在那塊記憶體歸p3所有, p1成為無效的針.

p3.reset();//釋放記憶體.

p1.reset();//無效

unique_ptr 在 中的定義如下:

// non-specialized 

template > class unique_ptr;

// array specialization

template class unique_ptr;

其中 t 指其管理的物件型別,d 指該物件銷毀時所呼叫的釋放方法,可以使用自定義的刪除器,他也有乙個預設的實現,即 detele 操作。

2.1 構造方法 std::unique_ptr::unique_ptr

// unique_ptr constructor example

#include #include int main ()

執行結果為:

u1: null

u2: null

u3: not null

u4: not null

u5: null

u6: null

u7: not null

u8: not null

2.2 析構方法 std::unique_ptr::~unique_ptr

// unique_ptr destructor example

#include #include int main () ;

std::unique_ptrfoo (new int,deleter);

std::cout << "foo " << (foo?"is not":"is") << " empty\n";

return 0; // [deleter called]

}

執行結果為:

foo is not empty

[deleter called]

2.3 釋放方法 std::unique_ptr::release

注意!注意!注意!這裡的釋放並不會銷毀其指向的物件,而且將其指向的物件釋放出去。

// unique_ptr::release example

#include #include int main ()

執行結果為:

manual_pointer points to 10
2.4 重置方法 std::unique_ptr::reset

// unique_ptr::reset example

#include #include int main ()

執行結果為:

5

10

2.5 交換方法 std::unique_ptr::swap

// unique_ptr::swap example

#include #include int main ()

執行結果為:

foo: 20

bar: 10

當你的物件不能僅僅只是依靠 delete 刪除時,那麼你就需要依靠自定義的刪除器了。例如物件中還有其它物件的陣列等。

主要就是自己編寫乙個刪除器,指定輸入的引數,然後實現相應的釋放操作,並將這個刪除器傳入 unique_ptr 中。

3.1 開發中經常會使用到,假設有這麼乙個的結構體定義如下

/// 影象格式定義

typedef struct cv_image_t cv_image_t;

3.2 再寫乙個的釋放方法

void cv_image_release(cv_image_t* image) 

delete image->data;

delete image;

return;

}

3.3 然後我們在**中就可以使用乙個如下的智慧型指標來智慧型的控制的釋放操作了

cv_image_t image_input = ;

std::unique_ptrimage_guard (image_input , cv_image_release);

3.4 優化寫法

應用中很多地方都要使用,然後都需要這樣乙個的智慧型指標,不過每次都寫這麼一長串很麻煩,而且定義也都是一樣的,那麼我們就可以簡單的封裝一下,比如可以定義乙個 cv_image_ptr 專門,如下:

struct cv_image_destructor}; 

typedef std::unique_ptrcv_image_ptr;

這樣我們再在**中使用的時候就方便很多了,例如

cv_image_ptr image_guard;

image_guard.reset(image_input);

而且**看上去也整潔了很多。

關於 unique_ptr 更官方和詳細的說明,可以參考:

智慧型指標 unique ptr

unique ptr 是 c 11 提供的用於防止記憶體洩漏的智慧型指標中的一種實現,獨享被管理物件指標所有權的智慧型指標。int main std move是將物件的狀態或者所有權從乙個物件轉移到另乙個物件,只是轉移,沒有記憶體的搬遷或者記憶體拷貝所以可以提高利用效率,改善效能.get函式會返回儲...

c 智慧型指標 unique ptr

智慧型指標是基於raii機制實現的類 模板 具有指標的行為 過載了operator 與operator 操作符 可以 智慧型 地銷毀其所指物件。c 11中有unique ptr shared ptr與weak ptr等智慧型指標,可以對動態資源進行管理 unique ptr 唯一 擁有其所指物件,同...

C 智慧型指標 unique ptr

unique ptr 唯一 擁有其所指物件,同一時刻只能有乙個unique ptr指向給定物件 通過禁止拷貝語義 只有移動語義來實現 unique ptr指標本身的生命週期 從unique ptr指標建立時開始,直到離開作用域。離開作用域時,若其指向物件,則將其所指物件銷毀 預設使用delete操作...