最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

C/C++編程筆記:C++庫提供的四種智能指針!學(xué)習(xí)一下

2021-03-29 19:32 作者:C語言編程__Plus  | 我要投稿

C++庫提供以下類型的智能指針的實現(xiàn):

auto_ptr

unique_ptr

shared_ptr

weak_ptr

它們都在內(nèi)存頭文件中聲明。


文章來源丨極客(geeksforGeeks)?

auto_ptr

從C ++ 11開始不推薦使用此類模板。unique_ptr是一種具有類似功能但具有改進(jìn)的安全性的新功能。

auto_ptr是一個智能指針,用于管理通過新表達(dá)式獲得的對象,并在銷毀auto_ptr本身時刪除該對象。

當(dāng)使用auto_ptr類描述對象時,它存儲指向單個已分配對象的指針,以確保當(dāng)其超出范圍時,它指向的對象必須自動銷毀。它基于專有所有權(quán)模型,即相同類型的兩個指針不能同時指向同一資源。如以下程序所示,指針的復(fù)制或分配會更改所有權(quán),即源指針必須將所有權(quán)賦予目標(biāo)指針。


復(fù)制構(gòu)造函數(shù)和auto_ptr的賦值運(yùn)算符實際上并不復(fù)制存儲的指針,而是將其轉(zhuǎn)移,而將第一個auto_ptr對象留空。這是實現(xiàn)嚴(yán)格所有權(quán)的一種方法,因此在任何給定時間只有一個auto_ptr對象可以擁有該指針,即在需要復(fù)制語義的地方不應(yīng)使用auto_ptr。

為什么不建議使用auto_ptr?

它以沒有兩個指針都不應(yīng)包含同一對象的方式獲取指針的所有權(quán)。分配會轉(zhuǎn)移所有權(quán),并將右值自動指針重置為空指針。因此,由于上述無法復(fù)制,因此無法在STL容器中使用它們。


unique_ptr

std :: unique_ptr用C ++ 11開發(fā),替代了std :: auto_ptr。

unique_ptr是一種具有類似功能的新設(shè)施,但具有改進(jìn)的安全性(無偽造副本分配),增加的功能(刪除器)和對陣列的支持。它是原始指針的容器。它顯式地防止了其復(fù)制的指針的復(fù)制,這與正常賦值會發(fā)生的情況相同,即它只允許底層指針的一個所有者。

因此,當(dāng)使用unique_ptr時,任何一種資源最多只能有一個unique_ptr,并且當(dāng)該unique_ptr被銷毀時,該資源將被自動聲明。另外,由于任何資源只能有一個unique_ptr,因此任何嘗試復(fù)制unique_ptr的嘗試都會導(dǎo)致編譯時錯誤。

unique_ptr <A> ptr1(新A);

?//錯誤:無法復(fù)制

unique_ptr unique_ptr <A> ptr2 = ptr1;

但是,可以使用新的移動語義來移動unique_ptr,即使用std :: move()函數(shù)將所包含的指針的所有權(quán)轉(zhuǎn)移到另一個unique_ptr。

//有效,資源現(xiàn)在存儲在ptr2中

unique_ptr <A> ptr2 = move(ptr1);

因此,當(dāng)我們想要指向?qū)ο蟮膯蝹€指針而銷毀該單個指針時將回收該對象時,最好使用unique_ptr。


下面的代碼返回一個資源,如果我們不顯式捕獲返回值,該資源將被清除。如果這樣做,則我們擁有該資源的專有所有權(quán)。這樣,我們可以認(rèn)為unique_ptr是對auto_ptr的更安全,更好的替代。


什么時候使用unique_ptr?

當(dāng)您想要擁有資源的單一所有權(quán)(獨(dú)占)時,請使用unique_ptr。只有一個unique_ptr可以指向一種資源。由于單個資源可以有一個unique_ptr,因此不可能將一個unique_ptr復(fù)制到另一個資源。


shared_ptr

shared_ptr是原始指針的容器。它是一個引用計數(shù)所有權(quán)模型,即它與shared_ptr的所有副本協(xié)作維護(hù)其包含的指針的引用計數(shù)。因此,每當(dāng)一個新的指針指向資源時,計數(shù)器就會增加,而在調(diào)用對象的析構(gòu)函數(shù)時,計數(shù)器就會減少。

引用計數(shù):這是一種用于存儲對資源(例如對象,內(nèi)存塊,磁盤空間或其他資源)的引用,指針或句柄數(shù)量的技術(shù)。

直到引用計數(shù)大于零(即,直到shared_ptr的所有副本都已刪除),包含的原始指針引用的對象才會被銷毀。

因此,當(dāng)我們要將一個原始指針分配給多個所有者時,應(yīng)該使用shared_ptr。


什么時候使用shared_ptr?

如果要共享資源所有權(quán),請使用shared_ptr。許多shared_ptr可以指向一個資源。shared_ptr維護(hù)此提議的參考計數(shù)。當(dāng)所有shared_ptr指向資源的范圍超出范圍時,資源將被銷毀。


weak_ptr

創(chuàng)建weak_ptr作為shared_ptr的副本。它提供對一個或多個shared_ptr實例擁有但不參與引用計數(shù)的對象的訪問。weak_ptr的存在或破壞對shared_ptr或其其他副本沒有影響。在某些情況下,需要在shared_ptr實例之間中斷循環(huán)引用。

循環(huán)依賴性(shared_ptr的問題):

讓我們考慮一個場景,其中我們有兩個類A和B,它們都具有指向其他類的指針。因此,總是像A指向B,B指向A。因此,use_count永遠(yuǎn)不會達(dá)到零,也永遠(yuǎn)不會被刪除。


這就是我們使用弱指針(weak_ptr)的原因,因為它們沒有引用計數(shù)。因此,聲明了weak_ptr的類沒有它的據(jù)點(diǎn),即所有權(quán)不是共享的,但是他們可以訪問這些對象。


因此,在shared_ptr由于循環(huán)依賴而導(dǎo)致use_count永遠(yuǎn)不會為零的情況下,使用weak_ptr可以防止此問題,這通過將A_ptr聲明為weak_ptr來解決此問題,因此,類A不擁有它,只能訪問它,我們還需要檢查對象的有效性,因為它可能超出范圍。通常,這是一個設(shè)計問題。

什么時候使用weak_ptr?

當(dāng)您確實要從多個位置引用對象時–對于可以忽略和取消分配的引用(因此,當(dāng)您嘗試取消引用時,它們只會指出對象已消失)。

每天學(xué)點(diǎn)小知識,希望對你有幫助~

另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!筆者這里或許可以幫到你~

微信公眾號:C語言編程學(xué)習(xí)基地

分享(源碼、項目實戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)

歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!



C/C++編程筆記:C++庫提供的四種智能指針!學(xué)習(xí)一下的評論 (共 條)

分享到微博請遵守國家法律
东明县| 尖扎县| 陆川县| 株洲县| 都兰县| 邢台县| 泽库县| 西充县| 山阳县| 区。| 迭部县| 怀来县| 望奎县| 杨浦区| 麻江县| 宣武区| 申扎县| 元阳县| 拉萨市| 夹江县| 彭州市| 汉川市| 德兴市| 三台县| 恩施市| 滨州市| 上杭县| 庆元县| 成武县| 原平市| 阜康市| 汽车| 富民县| 定南县| 金溪县| 余江县| 六安市| 松江区| 栾川县| 社会| 龙门县|