簡單地說,c++智慧型指標是包含過載運算子的類,其行為像常規指標,但智慧型指標能夠及時、妥善地銷毀動態分配的資料,並實現了明確的物件生命週期,因此更有價值。
c++在記憶體分配、釋放和管理方面向程式猿提供了全面的靈活性。但是這種靈活性是把雙刃劍,一方面它使c++成為一種功能強大的語言,另一方面它讓程式猿能夠製造與記憶體相關的問題,比如記憶體洩漏。
例如在堆宣告和分配的記憶體,析構方法是否會自動銷毀物件,又或是方法結束後需要乙個個釋放,方法存在很多返回的地方,每個返回語句都要執行很多相關釋放操作,十分繁瑣,用智慧型指標就能實現其自動釋放。
鑑於使用常規指標存在的問題,當c++程式猿需要管理堆中的資料時,可使用智慧型指標的方式分配和管理記憶體。
智慧型指標類過載了解除引用運算子(*)和成員選擇運算子(->)。
同時為了能夠在堆中管理各種型別,幾乎所有的智慧型指標都是模板類,包含其功能的泛型實現。
unique_ptr 是從 c++ 11 開始,定義在 中的智慧型指標(smart pointer)。它持有對物件的獨有權,即兩個 unique_ptr 不能指向乙個物件,不能進行複製操作只能進行移動操作。
unique_ptr 之所以叫這個名字,是因為它智慧型指向乙個物件,即當它指向其他物件時,之前所指向的物件會被摧毀。其次,當 unique_ptr 超出作用域時,指向的物件也會被自動摧毀,幫助程式猿實現了自動釋放的功能。
unique_ptr 也可能還未指向物件,這時的狀態被稱為 empty。
unique_ptr 在 中的定義如下:std::unique_ptrp1(new int(5));
std::unique_ptrp2=p1;// 編譯會出錯
std::unique_ptrp3=std::move(p1);// 轉移所有權, 現在那塊記憶體歸p3所有, p1成為無效的針.
p3.reset();//釋放記憶體.
p1.reset();//無效
其中 t 指其管理的物件型別,d 指該物件銷毀時所呼叫的釋放方法,可以使用自定義的刪除器,他也有乙個預設的實現,即 detele 操作。// non-specialized
template > class unique_ptr;
// array specialization
template class unique_ptr;
2.1 構造方法 std::unique_ptr::unique_ptr
執行結果為:// unique_ptr constructor example
#include #include int main ()
2.2 析構方法 std::unique_ptr::~unique_ptru1: null
u2: null
u3: not null
u4: not null
u5: null
u6: null
u7: not null
u8: not null
執行結果為:// 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]
}
2.3 釋放方法 std::unique_ptr::releasefoo is not empty
[deleter called]
注意!注意!注意!這裡的釋放並不會銷毀其指向的物件,而且將其指向的物件釋放出去。
執行結果為:// 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 ()
2.5 交換方法 std::unique_ptr::swap5
10
執行結果為:// unique_ptr::swap example
#include #include int main ()
當你的物件不能僅僅只是依靠 delete 刪除時,那麼你就需要依靠自定義的刪除器了。例如物件中還有其它物件的陣列等。foo: 20
bar: 10
主要就是自己編寫乙個刪除器,指定輸入的引數,然後實現相應的釋放操作,並將這個刪除器傳入 unique_ptr 中。
3.1 開發中經常會使用到,假設有這麼乙個的結構體定義如下
3.2 再寫乙個的釋放方法/// 影象格式定義
typedef struct cv_image_t cv_image_t;
3.3 然後我們在**中就可以使用乙個如下的智慧型指標來智慧型的控制的釋放操作了void cv_image_release(cv_image_t* image)
delete image->data;
delete image;
return;
}
3.4 優化寫法cv_image_t image_input = ;
std::unique_ptrimage_guard (image_input , cv_image_release);
應用中很多地方都要使用,然後都需要這樣乙個的智慧型指標,不過每次都寫這麼一長串很麻煩,而且定義也都是一樣的,那麼我們就可以簡單的封裝一下,比如可以定義乙個 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操作...