1. 智能指標概念
智能指標是基於RAII機制實現的類(模板),具有指標的行為(重載了operator*與operator->操作符),可以“智能”地銷毀其所指對象。C++11中有unique_ptr、shared_ptr與weak_ptr等智能指標,可以對動態資源進行管理
2. unique_ptr概念
unique_ptr“”擁有其所指對象,同一時刻只能有一個unique_ptr指向給定對象(通過禁止拷貝語義、只有移動語意來實現)。
unique_ptr指標本身的生命週期:從unique_ptr指標建立時開始,直到離開範圍。離開範圍時,若其指向對象,則將其所指對象銷毀(預設使用delete操作符,使用者可指定其他動作)。
unique_ptr指標與其所指對象的關係:在智能指標生命週期內,可以改變智能指標所指對象,如建立智能指標時通過建構函式指定、通過reset方法重新指定、通過release方法釋放所有權、通過移動語意轉移所有權。
3. unique_ptr的基本操作:
//智能指標的建立unique_ptr<int> u_i; //建立u_i.reset(new int(3)); //"綁定”動態對象unique_ptr<int> u_i2(new int(4));//建立時指定動態對象//所有權的變化int *p_i = u_i2.release(); //釋放所有權unique_ptr<string> u_s(new string("abc"));unique_ptr<string> u_s2 = std::move(u_s); //所有權轉移(通過移動語意),u_s所有權轉移後,變成“null 指標”u_s2=nullptr;//顯式銷毀所指對象,同時智能指標變為空白指標。與u_s2.reset()等價
4. unique_ptr的使用情境
void foo(){//不安全的代碼 X *px = new X; // do something, exception may occurs delete px; // may not go here}
void foo(){//異常安全的代碼。無論是否異常發生,只要px指標成功建立,其解構函式都會被調用,確保動態資源被釋放 unique_ptr<X> px(new X); // do something,}
unique_ptr<X> foo(){ unique_ptr<X> px(new X); // do something return px; //移動語意}
方式一:
vector<unique_ptr<string>> vs { new string{“Doug”}, new string{“Adams”} };
方式二:
vector<unique_ptr<string>>v;unique_ptr<string> p1(new string("abc"));v.push_back(std::move(p1));//這裡需要顯式的移動語意,因為unique_ptr並無copy語義
unique_ptr<int[]> p (new int[3]{1,2,3}); p[0] = 0;// 重載了operator[]
5. 自訂資源刪除操作(Deleter):
void end_connection(connection *p) { disconnect(*p); } //資源清理函數unique_ptr<connection, decltype(end_connection)*> //資源清除程式的“類型” p(&c, end_connection);// 傳入函數名,會自動轉換為函數指標
6 auto_ptr與unique_ptr