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

本文要學(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í)成長比自己琢磨更快哦!
