智能指針
智能指針(Smart Pointers)是一種用于管理動態(tài)分配的內(nèi)存的對象。它們可以自動處理資源的釋放,從而減少內(nèi)存泄漏的風(fēng)險。最常見的智能指針類型有std::unique_ptr和std::shared_ptr。
std::unique_ptr
unique_ptr是一種獨占所有權(quán)的智能指針。一個unique_ptr是唯一指向一塊內(nèi)存的所有者,當(dāng)unique_ptr超出作用域或被顯式地釋放時,內(nèi)存會被自動釋放。
Case :

std::shared_ptr
shared_ptr是一種共享所有權(quán)的智能指針。多個shared_ptr可以指向同一塊內(nèi)存,并且會跟蹤有多少個指針指向該內(nèi)存(引用計數(shù))。只有當(dāng)最后一個指向該內(nèi)存的shared_ptr被銷毀時,內(nèi)存才會被釋放。
Case :

如果使用new關(guān)鍵字來創(chuàng)建shared_ptr,會導(dǎo)致更大的內(nèi)存開銷。因為new關(guān)鍵字分配了兩個獨立的內(nèi)存塊,一個用于存儲對象,另一個用于存儲引用計數(shù)(即shared_ptr的數(shù)量),而且在釋放內(nèi)存的時候也要分別釋放兩塊內(nèi)存。而make_shared函數(shù)將對象和引用計數(shù)存儲在同一塊內(nèi)存中,避免了額外的內(nèi)存分配。
但是shared_ptr有一個潛在的問題——循環(huán)引用。循環(huán)引用指的是兩個或多個對象相互持有對方的shared_ptr,導(dǎo)致它們的引用計數(shù)永遠(yuǎn)不會變?yōu)榱?,從而無法釋放內(nèi)存。
Case :

std::weak_ptr
std::weak_ptr也是一種智能指針,用于解決shared_ptr可能出現(xiàn)的循環(huán)引用問題。 weak_ptr允許創(chuàng)建一個指向shared_ptr所管理對象的非擁有引用。weak_ptr是一種弱引用,它允許觀察由shared_ptr管理的對象,而不會增加引用計數(shù)。換句話說,weak_ptr不會影響對象的生命周期。
weak_ptr的創(chuàng)建只能通過shared_ptr的賦值來實現(xiàn)。可以使用weak_ptr的成員函數(shù)lock來獲得指向所管理對象的shared_ptr強引用,它返回一個有效的shared_ptr,如果對象已被銷毀,則返回空的shared_ptr。
weak_ptr還提供了一個成員函數(shù)expired,用于檢查弱引用指向的對象是否已經(jīng)被銷毀。如果對象已銷毀,則返回true,否則返回false。
