C++11智能指針中的 unique_ptr實(shí)例詳解
在前面一篇文章中,我們了解了 C++11 中引入的智能指針之一 shared_ptr 和 weak_ptr ,今天,我們來(lái)介紹一下另一種智能指針 unique_ptr 。
往期文章參考:
【C++11新特性】 C++11 智能指針之shared_ptr
unique_ptr介紹
unique是獨(dú)特的、唯一的意思,故名思議,unique_ptr可以“獨(dú)占”地?fù)碛兴赶虻膶?duì)象,它提供一種嚴(yán)格意義上的所有權(quán)。
這一點(diǎn)和我們前面介紹的 shared_ptr 類型指針有很大的不同:shared_ptr 允許多個(gè)指針指向同一對(duì)象,而 unique_ptr 在某一時(shí)刻只能有一個(gè)指針指向該對(duì)象。
unique_ptr 保存指向某個(gè)對(duì)象的指針,當(dāng)它本身被刪除或者離開其作用域時(shí)會(huì)自動(dòng)釋放其指向?qū)ο笏加玫馁Y源。
1、如何創(chuàng)建unique_ptr
unique_ptr 不像shared_ptr一樣擁有標(biāo)準(zhǔn)庫(kù)函數(shù)make_shared來(lái)創(chuàng)建一個(gè)shared_ptr實(shí)例。
要想創(chuàng)建一個(gè) unique_ptr,我們需要將一個(gè) new 操作符返回的指針傳遞給unique_ptr的構(gòu)造函數(shù)。
示例:
int main() { // 創(chuàng)建一個(gè)unique_ptr實(shí)例 unique_ptr<int> pInt(new int(5)); cout << *pInt; }
2、無(wú)法進(jìn)行復(fù)制構(gòu)造和賦值操作
unique_ptr沒有 copy 構(gòu)造函數(shù),不支持普通的拷貝和賦值操作。
示例:
int main() { // 創(chuàng)建一個(gè)unique_ptr實(shí)例 unique_ptr<int> pInt(new int(5)); unique_ptr<int> pInt2(pInt); // 報(bào)錯(cuò) unique_ptr<int> pInt3 = pInt; // 報(bào)錯(cuò) }
3、可以進(jìn)行移動(dòng)構(gòu)造和移動(dòng)賦值操作
unique_ptr雖然沒有支持普通的拷貝和賦值操作,但卻提供了一種移動(dòng)機(jī)制來(lái)將指針的所有權(quán)從一個(gè)unique_ptr轉(zhuǎn)移給另一個(gè)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; // 出錯(cuò),pInt為空 cout << *pInt2 << endl; unique_ptr<int> pInt3(std::move(pInt2)); }
4、可以返回unique_ptr
unique_ptr不支持拷貝操作,但卻有一個(gè)例外:可以從函數(shù)中返回一個(gè)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使用場(chǎng)景
1、為動(dòng)態(tài)申請(qǐng)的資源提供異常安全保證
我們先來(lái)看看下面這一段代碼:
void Func() { int *p = new int(5); // ...(可能會(huì)拋出異常) delete p; }
這是我們傳統(tǒng)的寫法:當(dāng)我們動(dòng)態(tài)申請(qǐng)內(nèi)存后,有可能我們接下來(lái)的代碼由于拋出異?;蛘咛崆巴顺觯╥f語(yǔ)句)而沒有執(zhí)行delete操作。
解決的方法是使用unique_ptr來(lái)管理動(dòng)態(tài)內(nèi)存,只要unique_ptr指針創(chuàng)建成功,其析構(gòu)函數(shù)都會(huì)被調(diào)用。確保動(dòng)態(tài)資源被釋放。
void Func() { unique_ptr<int> p(new int(5)); // ...(可能會(huì)拋出異常) }
2、返回函數(shù)內(nèi)動(dòng)態(tài)申請(qǐng)資源的所有權(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é)束后,自動(dòng)釋放資源 }
3、在容器中保存指針
int main() { vector<unique_ptr<int>> vec; unique_ptr<int> p(new int(5)); vec.push_back(std::move(p)); // 使用移動(dòng)語(yǔ)義 }
4、管理動(dòng)態(tài)數(shù)組
標(biāo)準(zhǔn)庫(kù)提供了一個(gè)可以管理動(dòng)態(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實(shí)例詳解的文章就介紹到這了,更多相關(guān)C++11智能指針unique_ptr內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用c語(yǔ)言實(shí)現(xiàn)HUP信號(hào)重啟進(jìn)程的方法
本篇文章是對(duì)使用c語(yǔ)言實(shí)現(xiàn)HUP信號(hào)重啟進(jìn)程的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)程序
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09詳解C/C++ Linux出錯(cuò)處理函數(shù)(strerror與perror)的使用
我們知道,系統(tǒng)函數(shù)調(diào)用不能保證每次都成功,必須進(jìn)行出錯(cuò)處理,這樣一方面可以保證程序邏輯正常,另一方面可以迅速得到故障信息。本文主要為大家介紹兩個(gè)出錯(cuò)處理函數(shù)(strerror、perror)的使用,需要的可以參考一下2023-01-01C語(yǔ)言與C++項(xiàng)目實(shí)現(xiàn)相互調(diào)用
extern?“c”的作用可以實(shí)現(xiàn)c語(yǔ)言和c++相互調(diào)用,本文就詳細(xì)的介紹一下C語(yǔ)言與C++項(xiàng)目實(shí)現(xiàn)相互調(diào)用,感興趣的可以了解一下2022-01-01c++中臨時(shí)變量不能作為非const的引用參數(shù)的方法
下面小編就為大家?guī)?lái)一篇c++中臨時(shí)變量不能作為非const的引用參數(shù)的方法。小編覺得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-01-01