最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++11智能指針unique_ptr用法使用場景分析

 更新時間:2021年08月06日 10:56:06   作者:蘇克貝塔  
unique_ptr 是 C++ 11 提供的用于防止內(nèi)存泄漏的智能指針中的一種實現(xiàn),即使在異常發(fā)生時也可幫助避免資源泄露。這篇文章主要介紹了C++11智能指針unique_ptr用法介紹,需要的朋友可以參考下

一、概述

C++ 標(biāo)準(zhǔn)模板庫 STL(Standard Template Library) 一共給我們提供了四種智能指針:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,其中 auto_ptr 是 C++98 提出的,C++11 已將其摒棄,并提出了 unique_ptr 替代 auto_ptr。雖然 auto_ptr 已被摒棄,但在實際項目中仍可使用,但建議使用更加安全的 unique_ptr,后文會詳細(xì)敘述。shared_ptr 和 weak_ptr 則是 C+11 從準(zhǔn)標(biāo)準(zhǔn)庫 Boost 中引入的兩種智能指針。此外,Boost 庫還提出了 boost::scoped_ptr、boost::scoped_array、boost::intrusive_ptr 等智能指針,雖然尚未得到 C++ 標(biāo)準(zhǔn)采納,但是在開發(fā)實踐中可以使用。

二、實現(xiàn)原理

  1. unique_ptr 是 C++ 11 提供的用于防止內(nèi)存泄漏的智能指針中的一種實現(xiàn),即使在異常發(fā)生時也可幫助避免資源泄露。
  2. unique_ptr實現(xiàn)了獨享被管理對象指針的概念,這意味這它可確保一個對象和其對應(yīng)的資源同一時間只被一個pointer擁有。一旦擁有者被銷毀或者變成empty或者開始擁有另一個對象,先前擁有的那個對象就會被銷毀,其任何相應(yīng)資源亦會被釋放。
  3. unique_ptr具有->和*運算符重載符,因此它可以像普通指針一樣使用。

三、使用場景

先看不使用智能指針,寫代碼時的痛點,有可能忘記delete對象,在某處return的時候,或者在某處拋出異常,導(dǎo)致末尾的delete語句就沒機會被調(diào)用,導(dǎo)致內(nèi)存泄漏。在還是只new一個對象,如果new2,3甚至更多對象,那管理起來,代碼變的比較復(fù)雜,而且累贅。

這是一種不好的編程風(fēng)格,應(yīng)該避免,因為它復(fù)雜而又容易出錯。

#include <memory>
#include<iostream>
using namespace std;

class A {};
int main()
{
	A* ptrA = new A;
	try
	{
		//...
		//...
		//...
		//...
		//...
	}
	catch (...)
	{
		delete ptrA;		//1
		throw;
	}

	delete ptrA;			//2
	return 0;
}

了解了這個痛點,那么本篇的主角unique_ptr就該閃亮登場了。

unique_ptr對象可以在自身被銷毀時釋放其所指向的數(shù)據(jù)。并且unique_ptr它所指向的對象只有一個擁有者。

上面糟心的代碼就可以用unique_ptr來優(yōu)化,在也不需要delete和catch子句。

#include <memory>
#include<iostream>
using namespace std;

class A {};
int main()
{
	unique_ptr<A> upA(new A);
	
	//...
	//...

	return 0;
}

四、unique_ptr的目的

  • 獲取某些資源
  • 執(zhí)行某些操作
  • 將取得的資源釋放掉

五、常用操作

unique_ptr<int> up1(new int(1));//ok
unique_ptr<int> up2 = new int(1);//error

構(gòu)造函數(shù)1:可以用原始指針當(dāng)實參傳給構(gòu)造函數(shù)。

但不能使用=賦值符,那樣的話會報錯,“無法從“int *”轉(zhuǎn)換為“std::shared_ptr”,是不是很熟悉。

這點和share_ptr一致

構(gòu)造函數(shù)2:make_unique函數(shù)

unique_ptr<string> up4 = make_unique<string>("hello");//ok

構(gòu)造函數(shù)3

int* p = new int;
unique_ptr<int> up5(p);//ok
unique_ptr<int> up6(p);//logic error,這個是運行期錯誤,程序員必須避免這樣的失誤

這樣的問題在于sp1,sp2,在丟失p的擁有權(quán)時釋放相應(yīng)資源,即會執(zhí)行兩次delete p操作。

不可以對unique_ptr執(zhí)行copy或者assign操作,只能move,將擁有權(quán)移交給另一個unique_ptr

	int* p = new int;
	unique_ptr<int> up5(p);//ok
	unique_ptr<int> up6(up5);//error
	unique_ptr<int> up7(move(up5));//ok
操作 效果
unique_ptr up Default構(gòu)造函數(shù),建立一個empty unique pointer
unique_ptr up(ptr) 建立unique pointer令其擁有*ptr
unique_ptr up(nullptr) 建立一個empty unique pointer
unique_ptr up(move(up2)) 建立一個unique pointer,擁有up2之前擁有的pointer(up2將為empty)
up.~unique_ptr() 析構(gòu)函數(shù),調(diào)用deleter
up=up2 賦值(sp將共享sp2的擁有權(quán),放棄其先前索擁有對象的所有權(quán))
up=move(up2) move assignment(sp2將擁有權(quán)移交給up)
up=nullptr 對一個被擁有物調(diào)用delete,i并令為空(等價up.reset())
up1.swap(up2)==swap(up1,up2) 交換up1,up2的pointer
up.reset() 放棄擁有權(quán),并重新初始化,使它=empty
up.reset(ptr) 放棄擁有權(quán),重新初始化(擁有*ptr)
make_unique(…) 為一個新對象(以傳入的實參為初值)建立一個unique pointer
up.get() 返回存儲的pointer,就是返回原始指針,對該原始指針如果執(zhí)行delete,會異常。
*up 同上
up-> 為擁有物提供成員訪問
if(up) 判斷sp是否empty
get_deleter(up) 返回deleter的地址(如果有的話),沒有返回nullptr

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

相關(guān)文章

  • C++設(shè)計模式編程中Template Method模板方法模式的運用

    C++設(shè)計模式編程中Template Method模板方法模式的運用

    這篇文章主要介紹了C++設(shè)計模式編程中Template Method模板方法模式的運用,講到了包括模板方法模式中的細(xì)分方法以及適用場景,需要的朋友可以參考下
    2016-03-03
  • C語言詳細(xì)分析宏定義的使用

    C語言詳細(xì)分析宏定義的使用

    宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的替換。字符串中可以含任何字符,可以是常數(shù),也可以是表達式,預(yù)處理程序?qū)λ蛔魅魏螜z查,如有錯誤,只能在編譯已被宏展開后的源程序時發(fā)現(xiàn)
    2022-04-04
  • 教你5分鐘輕松搞定內(nèi)存字節(jié)對齊

    教你5分鐘輕松搞定內(nèi)存字節(jié)對齊

    隨便google一下,人家就可以跟你解釋的,一大堆的道理,我們沒怎么多時間,討論為何要對齊.直入主題,怎么判斷內(nèi)存對齊規(guī)則,sizeof的結(jié)果怎么來的,請牢記以下3條原則
    2013-09-09
  • C語言數(shù)據(jù)結(jié)構(gòu)深入探索順序表

    C語言數(shù)據(jù)結(jié)構(gòu)深入探索順序表

    大家好,今天給大家?guī)淼氖琼樞虮恚矣X得順序表還是有比較難理解的地方的,于是我就把這一塊的內(nèi)容全部整理到了一起,希望能夠給剛剛進行學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的人帶來一些幫助,或者是已經(jīng)學(xué)過這塊的朋友們帶來更深的理解,我們現(xiàn)在就開始吧
    2022-05-05
  • C++中點操作符和箭頭操作符的使用詳解

    C++中點操作符和箭頭操作符的使用詳解

    本篇文章介紹了,C++中點操作符和箭頭操作符的使用詳解。需要的朋友參考下
    2013-05-05
  • C++使用遞歸函數(shù)和棧操作逆序一個棧的算法示例

    C++使用遞歸函數(shù)和棧操作逆序一個棧的算法示例

    這篇文章主要介紹了C++使用遞歸函數(shù)和棧操作逆序一個棧的算法,結(jié)合實例形式分析了C++遞歸函數(shù)與逆序棧的相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • C++實現(xiàn)LeetCode(2.兩個數(shù)字相加)

    C++實現(xiàn)LeetCode(2.兩個數(shù)字相加)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(兩個數(shù)字相加),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 基于QT制作一個TCPServer與TCPClient的通信

    基于QT制作一個TCPServer與TCPClient的通信

    這篇文章主要為大家詳細(xì)介紹了如何基于QT制作一個TCPServer與TCPClient的通信,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • C++實現(xiàn)調(diào)用系統(tǒng)時間簡單示例

    C++實現(xiàn)調(diào)用系統(tǒng)時間簡單示例

    這篇文章主要介紹了C++實現(xiàn)調(diào)用系統(tǒng)時間,需要的朋友可以參考下
    2014-07-07
  • C++樹之遍歷二叉樹實例詳解

    C++樹之遍歷二叉樹實例詳解

    這篇文章主要給大家介紹了關(guān)于C++樹之遍歷二叉樹的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

赣榆县| 乐山市| 怀化市| 上虞市| 雅江县| 民和| 安康市| 潢川县| 安丘市| 三穗县| 兴城市| 临汾市| 庆阳市| 治多县| 青神县| 宜阳县| 东乡县| 开化县| 乳源| 沁源县| 富源县| 长泰县| 滦南县| 个旧市| 满洲里市| 分宜县| 建德市| 承德市| 佛教| 紫金县| 岐山县| 土默特左旗| 鄂托克前旗| 汉中市| 鲁山县| 昆明市| 博野县| 洪洞县| 霍邱县| 广州市| 苍梧县|