超詳細(xì)解析!C++ 智能指針的工作原理
智能指針是一種自動(dòng)管理堆上對(duì)象指針的 c++++ 數(shù)據(jù)結(jié)構(gòu),它通過(guò)引用計(jì)數(shù)機(jī)制實(shí)現(xiàn)自動(dòng)內(nèi)存釋放,從而防止內(nèi)存泄漏,簡(jiǎn)化代碼,確保線程安全。它的優(yōu)勢(shì)包括:自動(dòng)釋放內(nèi)存防止內(nèi)存泄漏線程安全簡(jiǎn)化代碼。
簡(jiǎn)單來(lái)說(shuō),智能指針的作用就是輕松管理內(nèi)存釋放,更好的管理你的堆內(nèi)存。
使用時(shí)只管new即可,不用想著delete,經(jīng)典的管殺不管埋
此時(shí)我們先簡(jiǎn)單的仿寫一個(gè)智能指針的類,還原其原理:當(dāng)指向內(nèi)存時(shí),計(jì)數(shù)器增加,當(dāng)析構(gòu)時(shí)計(jì)數(shù)器為0時(shí),delete該空間
為什么需要智能指針
手動(dòng)管理內(nèi)存極易出錯(cuò),例如:
忘記釋放內(nèi)存多次釋放同一塊內(nèi)存(即雙重釋放)不明確資源的所有權(quán)
智能指針類型及用途
std::unique_ptr 獨(dú)占指針
std::unique_ptr 是 C++ 標(biāo)準(zhǔn)庫(kù)中的一種智能指針,用于實(shí)現(xiàn)獨(dú)占所有權(quán)。它不能被復(fù)制,只能轉(zhuǎn)移(即通過(guò) std::move)所有權(quán)。這個(gè)轉(zhuǎn)移的過(guò)程本質(zhì)上是使用移動(dòng)語(yǔ)義,讓新指針接管對(duì)象的所有權(quán),而原指針則被置為空。這種機(jī)制不僅提高了效率,還可以確保資源的唯一所有權(quán)不被破壞。
特點(diǎn)
所指向的內(nèi)存為自己所獨(dú)有,同一個(gè)時(shí)空中只能有一個(gè)unique_ptr指向給定的對(duì)象2. 對(duì)象不支持同類賦值和拷貝構(gòu)造,但是可以轉(zhuǎn)移
用途:適用于那些明確只有一個(gè)所有者的場(chǎng)景,不允許多處共享。
如果指向同一塊內(nèi)存會(huì)報(bào)錯(cuò)。
C++ 智能指針:深入解析其工作原理和優(yōu)勢(shì)
1. 什么是智能指針?
智能指針是一種 C++ 數(shù)據(jù)結(jié)構(gòu),它可以自動(dòng)管理指向堆上對(duì)象的指針,并負(fù)責(zé)在對(duì)象不再使用時(shí)釋放其內(nèi)存。
立即學(xué)習(xí)“C++免費(fèi)學(xué)習(xí)筆記(深入)”;
2. 工作原理
智能指針通過(guò)使用引用計(jì)數(shù)機(jī)制實(shí)現(xiàn)自動(dòng)內(nèi)存管理:
創(chuàng)建智能指針時(shí):引用計(jì)數(shù)器被初始化為 1。
復(fù)制智能指針時(shí):引用計(jì)數(shù)器遞增。
智能指針超出作用域時(shí):引用計(jì)數(shù)器遞減。
引用計(jì)數(shù)器達(dá)到 0 時(shí):智能指針釋放指向的對(duì)象的內(nèi)存。
3. 優(yōu)勢(shì)
智能指針提供以下優(yōu)勢(shì):
自動(dòng)內(nèi)存釋放:自動(dòng)管理內(nèi)存,無(wú)需手動(dòng)釋放。
防止內(nèi)存泄漏:引用計(jì)數(shù)器確保在對(duì)象不再使用時(shí)釋放內(nèi)存。
線程安全:內(nèi)部引用計(jì)數(shù)機(jī)制確保多線程環(huán)境下的安全。
簡(jiǎn)化代碼:通過(guò)自動(dòng)化內(nèi)存管理,簡(jiǎn)化了代碼并減少了錯(cuò)誤的可能性。
智能指針存在的意義
智能指針主要解決以下問(wèn)題:
(1)內(nèi)存泄漏:內(nèi)存手動(dòng)釋放,使用智能指針可以自動(dòng)釋放。
(2)共享所有權(quán)指針的傳播和釋放,比如多線程使用同一個(gè)對(duì)象時(shí)析構(gòu)問(wèn)題。
智能指針的實(shí)現(xiàn)依賴于C++語(yǔ)言的RAII(資源獲取即初始化)技術(shù),即資源的獲取和釋放應(yīng)該與對(duì)象的構(gòu)造和析構(gòu)分別相關(guān)聯(lián)。這意味著,在對(duì)象構(gòu)造時(shí)分配資源,而在對(duì)象析構(gòu)時(shí)釋放資源。
智能指針的原理就是將動(dòng)態(tài)分配的內(nèi)存塊與一個(gè)或多個(gè)智能指針對(duì)象相關(guān)聯(lián),以確保內(nèi)存塊在不再需要時(shí)能夠自動(dòng)釋放。通常情況下,智能指針會(huì)將內(nèi)存的所有權(quán)轉(zhuǎn)移到其自己的對(duì)象中,并在其析構(gòu)函數(shù)中釋放內(nèi)存。這樣就可以避免常見(jiàn)的內(nèi)存泄漏和釋放非法內(nèi)存等問(wèn)題。
C++里面有四個(gè)智能指針:auto_ptr、share_ptr、unique_ptr、weak_ptr。其中后三個(gè)是C++11支持的,并且第一個(gè)已經(jīng)在C++11棄用;所以,重點(diǎn)講解share_ptr、unique_ptr、weak_ptr。
它們的特點(diǎn):
(1)unique_ptr獨(dú)占對(duì)象的所有權(quán),由于沒(méi)有引用計(jì)數(shù),性能較好。
(2)share_ptr共享對(duì)象的所有權(quán),但性能略差。
(3)weak_ptr配合share_ptr,解決循環(huán)引用問(wèn)題。