日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

【C++11新特性】 C++11智能指针之unique_ptr

發(fā)布時間:2023/11/30 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++11新特性】 C++11智能指针之unique_ptr 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原創(chuàng)作品,轉(zhuǎn)載請標(biāo)明:http://blog.csdn.net/Xiejingfa/article/details/50759210

在前面一篇文章中,我們了解了C++11中引入的智能指針之一shared_ptr,今天,我們來介紹一下另一種智能指針unique_ptr。


unique_ptr介紹

unique是獨特的、唯一的意思,故名思議,unique_ptr可以“獨占”地?fù)碛兴赶虻膶ο?#xff0c;它提供一種嚴(yán)格意義上的所有權(quán)。這一點和我們前面介紹的shared_ptr類型指針有很大的不同:shared_ptr允許多個指針指向同一對象,而unique_ptr在某一時刻只能有一個指針指向該對象。unique_ptr保存指向某個對象的指針,當(dāng)它本身被刪除或者離開其作用域時會自動釋放其指向?qū)ο笏加玫馁Y源。

下面,我們就來具體介紹一下unique_ptr的基本特性。

1、如何創(chuàng)建unique_ptr

unique_ptr不像shared_ptr一樣擁有標(biāo)準(zhǔn)庫函數(shù)make_shared來創(chuàng)建一個shared_ptr實例。要想創(chuàng)建一個unique_ptr,我們需要將一個new 操作符返回的指針傳遞給unique_ptr的構(gòu)造函數(shù)。

示例:

int main() {// 創(chuàng)建一個unique_ptr實例unique_ptr<int> pInt(new int(5));cout << *pInt; }
  • 1
  • 2
  • 3
  • 4
  • 5

2、無法進(jìn)行復(fù)制構(gòu)造和賦值操作

unique_ptr沒有copy構(gòu)造函數(shù),不支持普通的拷貝和賦值操作。

int main() {// 創(chuàng)建一個unique_ptr實例unique_ptr<int> pInt(new int(5));unique_ptr<int> pInt2(pInt); // 報錯unique_ptr<int> pInt3 = pInt; // 報錯 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3、可以進(jìn)行移動構(gòu)造和移動賦值操作

unique_ptr雖然沒有支持普通的拷貝和賦值操作,但卻提供了一種移動機(jī)制來將指針的所有權(quán)從一個unique_ptr轉(zhuǎn)移給另一個unique_ptr。如果需要轉(zhuǎn)移所有權(quán),可以使用std::move()函數(shù)。

示例:

int main() {unique_ptr<int> pInt(new int(5));unique_ptr<int> pInt2 = std::move(pInt); // 轉(zhuǎn)移所有權(quán)//cout << *pInt << endl; // 出錯,pInt為空cout << *pInt2 << endl;unique_ptr<int> pInt3(std::move(pInt2)); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4、可以返回unique_ptr

unique_ptr不支持拷貝操作,但卻有一個例外:可以從函數(shù)中返回一個unique_ptr。

示例:

unique_ptr<int> clone(int p) {unique_ptr<int> pInt(new int(p));return pInt; // 返回unique_ptr }int main() {int p = 5;unique_ptr<int> ret = clone(p);cout << *ret << endl; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

unique_ptr使用場景

1、為動態(tài)申請的資源提供異常安全保證

我們先來看看下面這一段代碼:

void Func() {int *p = new int(5);// ...(可能會拋出異常)delete p; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

這是我們傳統(tǒng)的寫法:當(dāng)我們動態(tài)申請內(nèi)存后,有可能我們接下來的代碼由于拋出異常或者提前退出(if語句)而沒有執(zhí)行delete操作。

解決的方法是使用unique_ptr來管理動態(tài)內(nèi)存,只要unique_ptr指針創(chuàng)建成功,其析構(gòu)函數(shù)都會被調(diào)用。確保動態(tài)資源被釋放。

void Func() {unique_ptr<int> p(new int(5));// ...(可能會拋出異常) }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2、返回函數(shù)內(nèi)動態(tài)申請資源的所有權(quán)

unique_ptr<int> Func(int p) {unique_ptr<int> pInt(new int(p));return pInt; // 返回unique_ptr }int main() {int p = 5;unique_ptr<int> ret = Func(p);cout << *ret << endl;// 函數(shù)結(jié)束后,自動釋放資源 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3、在容器中保存指針

int main() {vector<unique_ptr<int>> vec;unique_ptr<int> p(new int(5));vec.push_back(std::move(p)); // 使用移動語義 }
  • 1
  • 2
  • 3
  • 4
  • 5

4、管理動態(tài)數(shù)組

標(biāo)準(zhǔn)庫提供了一個可以管理動態(tài)數(shù)組的unique_ptr版本。

int main() {unique_ptr<int[]> p(new int[5] {1, 2, 3, 4, 5});p[0] = 0; // 重載了operator[] }
  • 1
  • 2
  • 3
  • 4

5、作為auto_ptr的替代品


總結(jié)

以上是生活随笔為你收集整理的【C++11新特性】 C++11智能指针之unique_ptr的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。