C 11 建立和使用 unique ptr

2021-08-31 18:42:12 字數 3397 閱讀 4126

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()

使用舉例

輸出:  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

1、為動態申請的資源提供異常安全保證

我們先來看看下面這一段**:

void func()

這是我們傳統的寫法:當我們動態申請記憶體後,有可能我們接下來的**由於丟擲異常或者提前退出(if語句)而沒有執行delete操作。

解決的方法是使用unique_ptr來管理動態記憶體,只要unique_ptr指標建立成功,其析構函式都會被呼叫。確保動態資源被釋放。

void func()

2、返回函式內動態申請資源的所有權

unique_ptrfunc(int p)

int main()

3、在容器中儲存指標

int main() 

4、管理動態陣列

標準庫提供了乙個可以管理動態陣列的unique_ptr版本。

int main() 

); p[0] = 0; // 過載了operator

}

5、作為auto_ptr的替代品建立與釋放舉例

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