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

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

C/C++編程筆記:C++智能指針及其類型的介紹!重點(diǎn)分析

2021-03-26 21:08 作者:C語言編程__Plus  | 我要投稿



本文要學(xué)習(xí)的內(nèi)容:

(1)指針在C / C ++中的重要性。

(2)普通指針出現(xiàn)問題。

(3)為什么引入智能指針。

(2)智能指針的類型。

指針在C / C ++中的重要性:

指針用于訪問程序外部的資源,例如堆內(nèi)存。因此,如果在堆內(nèi)存中創(chuàng)建了任何東西,則用于訪問堆內(nèi)存。

普通指針的問題:

通過使用此示例,使用一個(gè)小型C ++程序,讓我們了解普通指針的主要問題是什么:


因此,發(fā)生的事情是它將有一個(gè)指針“ p”,這將指向一個(gè)矩形類型的對象,該對象將具有長度和寬度。一旦函數(shù)結(jié)束,將刪除該“ p”,因?yàn)閜是函數(shù)的局部變量,該變量將終止,但是在堆內(nèi)部分配的新矩形不會被釋放。它將返回并再次返回它的無限循環(huán),因此將再次創(chuàng)建新的p,然后再次為長度和寬度相同的矩形創(chuàng)建一個(gè)新的對象。那么,關(guān)于前一個(gè)對象的情況將不會被刪除,對于額外的新對象,也將不會被刪除。

因此,每次它都會創(chuàng)建一個(gè)對象,但不會刪除它,因此這會導(dǎo)致堆內(nèi)存中的內(nèi)存泄漏。就像內(nèi)存的長度和寬度一樣,雖然已分配但未使用,但未使用。因此,整個(gè)堆內(nèi)存可能是無限的,因此可能變得不可用。因此,在某一階段,由于缺少堆內(nèi)存,程序?qū)⒈罎ⅰR虼?,在fun()的最后,如果我們不提及這一點(diǎn),則應(yīng)使用'delete p',這將導(dǎo)致非常嚴(yán)重的問題。因此,由于程序員的懶惰或粗心,可能會出現(xiàn)這種類型的問題。因此,為了幫助程序員C ++ 11承擔(dān)責(zé)任并引入了智能指針。

智能指針

介紹堆內(nèi)存的問題在于,當(dāng)不需要它時(shí),必須將其自身釋放。因此,大多數(shù)程序員在編寫用于對象的重新分配的代碼時(shí)過于懶惰,這會導(dǎo)致嚴(yán)重的問題,例如內(nèi)存泄漏,這將導(dǎo)致程序崩潰。因此,諸如Java,C#、. Net Framework之類的語言提供了垃圾回收機(jī)制來取消分配未使用的對象。因此,在C ++ 11中,它引入了自動管理內(nèi)存的智能指針,當(dāng)指針不在作用域內(nèi)時(shí),它們將在不使用時(shí)自動釋放對象,從而自動釋放內(nèi)存。

考慮以下帶有普通指針的簡單C ++代碼。


使用智能指針,我們可以使指針以不需要顯式調(diào)用delete的方式工作。智能指針是指針的包裝類,帶有*和->重載的運(yùn)算符。智能指針類的對象看起來像一個(gè)指針,但是可以執(zhí)行普通指針不喜歡自動銷毀的許多事情(是的,我們不必顯式使用delete),引用計(jì)數(shù)等等。

這個(gè)想法是采用帶有指針,析構(gòu)函數(shù)和重載運(yùn)算符(例如*和->)的類。由于當(dāng)對象超出范圍時(shí)會自動調(diào)用析構(gòu)函數(shù),因此動態(tài)分配的內(nèi)存將自動刪除(或可以減少引用計(jì)數(shù))??紤]以下簡單的智能ptr類。


輸出:20

編寫一個(gè)適用于所有類型的智能指針類。

是的,我們可以使用模板編寫通用的智能指針類。以下C ++代碼演示了相同的過程。


輸出:

20

注意:智能指針在資源管理(例如文件句柄或網(wǎng)絡(luò)套接字)中也很有用。

智能指針的類型:

unique_ptr

如果您使用的是唯一指針,則如果創(chuàng)建了一個(gè)對象并且指針P1指向該對象,則只有一個(gè)指針可以同時(shí)指向該對象。因此,我們無法與其他指針共享,但是可以通過刪除P1將控件轉(zhuǎn)移到P2。


shared_ptr

如果您正在使用shared_ptr,則一次可以有多個(gè)指針指向該對象,并且它將使用use_count()方法維護(hù)一個(gè)引用計(jì)數(shù)器。


weak_ptr

它與shared_ptr非常相似,不同之處在于它不維護(hù)引用計(jì)數(shù)器。在這種情況下,指針將不會在對象上保持強(qiáng)大的狀態(tài)。原因是,如果假設(shè)指針持有該對象并請求其他對象,則它們可能會形成死鎖。

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

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

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

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

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


C/C++編程筆記:C++智能指針及其類型的介紹!重點(diǎn)分析的評論 (共 條)

分享到微博請遵守國家法律
建德市| 阿克陶县| 微博| 旬邑县| 始兴县| 谷城县| 鸡东县| 阿鲁科尔沁旗| 石首市| 广丰县| 沈阳市| 兴隆县| 西充县| 宣城市| 西安市| 石狮市| 莱州市| 漾濞| 阿巴嘎旗| 自贡市| 清水县| 柘城县| 浦江县| 紫金县| 且末县| 隆回县| 洛宁县| 湖北省| 天等县| 乌兰浩特市| 沛县| 营山县| 岳池县| 大新县| 襄垣县| 永新县| 中宁县| 句容市| 宝鸡市| 永新县| 南城县|