C 11 建立和使用 unique ptr

2021-08-21 10:41:35 字數 3244 閱讀 2072

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物件包裝乙個原始指標,並負責其生命週期。當該物件被銷毀時,會在其析構函式中釋放掉關聯的原始指標的動態記憶體,並刪除關聯的原始指標。這樣不管函式正常退出還是發...