C++11中的unique_ptr的詳細(xì)用法

這篇文章主要講解了C++11中的unique_ptr的詳細(xì)用法,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。

創(chuàng)新互聯(lián)建站于2013年開始,先為多倫等服務(wù)建站,多倫等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為多倫企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

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

往期文章參考:

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

【C++11新特性】 C++11智能指針之weak_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)庫函數(shù)make_shared來創(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、無法進(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ī)制來將指針的所有權(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使用場景

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

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

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

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

 delete p;
}

這是我們傳統(tǒng)的寫法:當(dāng)我們動(dòng)態(tài)申請內(nèi)存后,有可能我們接下來的代碼由于拋出異?;蛘咛崆巴顺觯╥f語句)而沒有執(zhí)行delete操作。

解決的方法是使用unique_ptr來管理動(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)申請資源的所有權(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)語義
}

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

標(biāo)準(zhǔn)庫提供了一個(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[]
}

看完上述內(nèi)容,是不是對(duì)C++11中的unique_ptr的詳細(xì)用法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享文章:C++11中的unique_ptr的詳細(xì)用法
URL地址:http://muchs.cn/article14/jehjde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、網(wǎng)站導(dǎo)航、手機(jī)網(wǎng)站建設(shè)、定制開發(fā)、標(biāo)簽優(yōu)化、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營