亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++11智能指針中的 unique_ptr實例詳解

 更新時間:2020年06月10日 14:20:06   作者:音視頻開發(fā)進(jìn)階  
unique是獨特的、唯一的意思,故名思議,unique_ptr可以“獨占”地?fù)碛兴赶虻膶ο?,它提供一種嚴(yán)格意義上的所有權(quán)。這篇文章主要介紹了C++11智能指針中的 unique_ptr實例詳解,需要的朋友可以參考下

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

往期文章參考:

【C++11新特性】 C++11 智能指針之shared_ptr

【C++11新特性】 C++11智能指針之weak_ptr

unique_ptr介紹

unique是獨特的、唯一的意思,故名思議,unique_ptr可以“獨占”地?fù)碛兴赶虻膶ο?,它提供一種嚴(yán)格意義上的所有權(quán)。

這一點和我們前面介紹的 shared_ptr 類型指針有很大的不同:shared_ptr 允許多個指針指向同一對象,而 unique_ptr 在某一時刻只能有一個指針指向該對象。

unique_ptr 保存指向某個對象的指針,當(dāng)它本身被刪除或者離開其作用域時會自動釋放其指向?qū)ο笏加玫馁Y源。

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;
}

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; // 報錯
}

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));
}

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;
}

unique_ptr使用場景

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

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

void Func()
{
 int *p = new int(5);

 // ...(可能會拋出異常)

 delete p;
}

這是我們傳統(tǒng)的寫法:當(dāng)我們動態(tài)申請內(nèi)存后,有可能我們接下來的代碼由于拋出異?;蛘咛崆巴顺觯╥f語句)而沒有執(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));

 // ...(可能會拋出異常)
}

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é)束后,自動釋放資源
}

3、在容器中保存指針

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

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[]
}

總結(jié)

到此這篇關(guān)于C++11智能指針中的 unique_ptr實例詳解的文章就介紹到這了,更多相關(guān)C++11智能指針unique_ptr內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • VC6.0常見鏈接錯誤與解決方法

    VC6.0常見鏈接錯誤與解決方法

    這篇文章主要介紹了VC6.0開發(fā)中一些常見鏈接錯誤的解決方法,需要的朋友可以參考下
    2013-07-07
  • C++11中的chrono庫詳解

    C++11中的chrono庫詳解

    C++11提供了日期時間相關(guān)的庫chrono,通過chrono庫可以很方便的處理日期和時間,這篇文章主要介紹了C++11中的chrono庫,需要的朋友可以參考下
    2023-03-03
  • C++變量判定的螺旋法則示例詳解

    C++變量判定的螺旋法則示例詳解

    這篇文章主要給大家介紹了關(guān)于C++變量判定的螺旋法則,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • c語言快速排序算法示例代碼分享

    c語言快速排序算法示例代碼分享

    快速排序使用分治法(Divide and conquer)策略來把一個串行(list)分為兩個子串行(sub-lists)
    2014-02-02
  • 用c語言實現(xiàn)HUP信號重啟進(jìn)程的方法

    用c語言實現(xiàn)HUP信號重啟進(jìn)程的方法

    本篇文章是對使用c語言實現(xiàn)HUP信號重啟進(jìn)程的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言實現(xiàn)隨機(jī)抽獎程序

    C語言實現(xiàn)隨機(jī)抽獎程序

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)隨機(jī)抽獎程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 詳解C/C++ Linux出錯處理函數(shù)(strerror與perror)的使用

    詳解C/C++ Linux出錯處理函數(shù)(strerror與perror)的使用

    我們知道,系統(tǒng)函數(shù)調(diào)用不能保證每次都成功,必須進(jìn)行出錯處理,這樣一方面可以保證程序邏輯正常,另一方面可以迅速得到故障信息。本文主要為大家介紹兩個出錯處理函數(shù)(strerror、perror)的使用,需要的可以參考一下
    2023-01-01
  • C語言與C++項目實現(xiàn)相互調(diào)用

    C語言與C++項目實現(xiàn)相互調(diào)用

    extern?“c”的作用可以實現(xiàn)c語言和c++相互調(diào)用,本文就詳細(xì)的介紹一下C語言與C++項目實現(xiàn)相互調(diào)用,感興趣的可以了解一下
    2022-01-01
  • c++中臨時變量不能作為非const的引用參數(shù)的方法

    c++中臨時變量不能作為非const的引用參數(shù)的方法

    下面小編就為大家?guī)硪黄猚++中臨時變量不能作為非const的引用參數(shù)的方法。小編覺得挺不錯的現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C++計算圖任意兩點間的所有路徑

    C++計算圖任意兩點間的所有路徑

    這篇文章主要為大家詳細(xì)介紹了C++求圖任意兩點間的所有路徑 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評論