unique_ptr 不共享它的指標。它無法複製到其他unique_ptr,無法通過值傳遞到函式,也無法用於需要副本的任何標準模板庫 (stl) 演算法。只能移動unique_ptr。這意味著,記憶體資源所有權將轉移到另一unique_ptr,並且原始unique_ptr不再擁有此資源。我們建議你將物件限制為由乙個所有者所有,因為多個所有權會使程式邏輯變得複雜。因此,當需要智慧型指標用於純 c++ 物件時,可使用unique_ptr,而當構造unique_ptr時,可使用make_unique helper 函式。
std::unique_ptr實現了獨享所有權的語義。乙個非空的std::unique_ptr總是擁有它所指向的資源。轉移乙個std::unique_ptr將會把所有權也從源指標轉移給目標指標(源指標被置空)。拷貝乙個std::unique_ptr將不被允許,因為如果你拷貝乙個std::unique_ptr,那麼拷貝結束後,這兩個std::unique_ptr都會指向相同的資源,它們都認為自己擁有這塊資源(所以都會企圖釋放)。因此std::unique_ptr是乙個僅能移動(move_only)的型別。當指標析構時,它所擁有的資源也被銷毀。預設情況下,資源的析構是伴隨著呼叫std::unique_ptr內部的原始指標的delete操作的。
下圖演示了兩個unique_ptr例項之間的所有權轉換。
1、如何建立unique_ptr
unique_ptr不像shared_ptr一樣擁有標準庫函式make_shared來建立乙個shared_ptr例項。要想建立乙個unique_ptr,我們需要將乙個new 操作符返回的指標傳遞給unique_ptr的建構函式。
示例:
int main()2、無法進行複製構造和賦值操作unique_ptr沒有copy建構函式,不支援普通的拷貝和賦值操作。
int main()3、可以進行移動構造和移動賦值操作
unique_ptr雖然沒有支援普通的拷貝和賦值操作,但卻提供了一種移動機制來將指標的所有權從乙個unique_ptr轉移給另乙個unique_ptr。如果需要轉移所有權,可以使用std::move()函式。
示例:
int main()4、可以返回unique_ptr
unique_ptr不支援拷貝操作,但卻有乙個例外:可以從函式中返回乙個unique_ptr。
示例:
unique_ptrclone(int p)int main()
使用舉例:1、為動態申請的資源提供異常安全保證輸出: fptr2 release before:00efb120
fptr2 release before:00000000 and pf value:4
move before fptr1 address:00000000 fptr3 address:00efec60
move after fptr1 address:00efec60 fptr3 address:00000000
move before fptr1 address:00efec60
move after fptr1 address:00000000
我們先來看看下面這一段**:
void func()這是我們傳統的寫法:當我們動態申請記憶體後,有可能我們接下來的**由於丟擲異常或者提前退出(if語句)而沒有執行delete操作。
解決的方法是使用unique_ptr來管理動態記憶體,只要unique_ptr指標建立成功,其析構函式都會被呼叫。確保動態資源被釋放。
void func()2、返回函式內動態申請資源的所有權
unique_ptrfunc(int p)3、在容器中儲存指標int main()
int main()4、管理動態陣列
標準庫提供了乙個可以管理動態陣列的unique_ptr版本。
int main()5、作為auto_ptr的替代品建立與釋放舉例); p[0] = 0; // 過載了operator
}
#include #include #include struct foo~foo()
void bar()
};void f(const foo &)
struct d
};void testautodestroy()
//2. 普通的new物件.
//3. 自定義的deleter.
}void testowner()
p1->bar();
}void testarrayowner()
p1[0].bar();
}int main()
輸出:
testdestroy....................foo::foo
foo::~foo
foo::foo
foo::foo
foo::foo
foo::foo
foo::~foo
foo::~foo
foo::~foo
foo::~foo
foo::foo
d operator()
foo::~foo
testowner....................
foo::foo
foo::bar
f(const foo&)
foo::bar
destroying p2...
foo::bar
foo::~foo
testarrayowner....................
foo::foo
foo::foo
foo::foo
foo::foo
foo::bar
f(const foo&)
foo::bar
destroying p2...
foo::bar
foo::~foo
foo::~foo
foo::~foo
foo::~foo
C 11 建立和使用 unique ptr
unique ptr 不共享它的指標。它無法複製到其他 unique ptr,無法通過值傳遞到函式,也無法用於需要副本的任何標準模板庫 stl 演算法。只能移動unique ptr。這意味著,記憶體資源所有權將轉移到另一 unique ptr,並且原始 unique ptr 不再擁有此資源。我們建議...
C 11 建立和使用 unique ptr
c 11 建立和使用 unique ptr unique ptr 不共享它的指標。它無法複製到其他 unique ptr,無法通過值傳遞到函式,也無法用於需要副本的任何標準模板庫 stl 演算法。只能移動unique ptr。這意味著,記憶體資源所有權將轉移到另一 unique ptr,並且原始 u...
C 11 建立和使用 unique ptr
unique ptr 是 c 11 提供的用於防止記憶體洩漏的智慧型指標中的一種實現,獨享被管理物件指標所有權的智慧型指標。unique ptr物件包裝乙個原始指標,並負責其生命週期。當該物件被銷毀時,會在其析構函式中釋放掉關聯的原始指標的動態記憶體,並刪除關聯的原始指標。這樣不管函式正常退出還是發...