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 例項之間的所有權轉換。
轉移 unique_ptr 的所有權
-unique_ptr不像shared_ptr一樣擁有標準庫函式make_shared來建立乙個shared_ptr例項。要想建立乙個unique_ptr,我們需要將乙個new 操作符返回的指標傳遞給unique_ptr的建構函式。示例:
#include
#include
using
namespace
std;
int main()
unique_ptr沒有copy建構函式,不支援普通的拷貝和賦值操作。
int main()
unique_ptr雖然沒有支援普通的拷貝和賦值操作,但卻提供了一種移動機制來將指標的所有權從乙個unique_ptr轉移給另乙個unique_ptr。如果需要轉移所有權,可以使用std::move()函式。
int main()
unique_ptr不支援拷貝操作,但卻有乙個例外:可以從函式中返回乙個unique_ptr。
示例:
unique_ptr clone(int p)
int main()
使用舉例
使用舉例:
輸出: 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()
unique_ptr func(int p)
int main()
int main()
標準庫提供了乙個可以管理動態陣列的unique_ptr版本。
int main()
); 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物件包裝乙個原始指標,並負責其生命週期。當該物件被銷毀時,會在其析構函式中釋放掉關聯的原始指標的動態記憶體,並刪除關聯的原始指標。這樣不管函式正常退出還是發...