C++智能指針weak_ptr的作用詳解
當(dāng)使用std::shared_ptr
時(shí),循環(huán)引用可能會(huì)導(dǎo)致資源泄漏的問題。下面是一個(gè)簡(jiǎn)單的示例,展示了循環(huán)引用導(dǎo)致資源泄漏的情況:
#include <iostream> #include <memory> class A; class B; class A { public: std::shared_ptr<B> b_ptr_; A() { std::cout << "A constructor" << std::endl; } ~A() { std::cout << "A destructor" << std::endl; } }; class B { public: std::shared_ptr<A> a_ptr_; B() { std::cout << "B constructor" << std::endl; } ~B() { std::cout << "B destructor" << std::endl; } }; int main() { std::shared_ptr<A> a_ptr(new A()); std::shared_ptr<B> b_ptr(new B()); a_ptr->b_ptr_ = b_ptr; // A持有B的shared_ptr b_ptr->a_ptr_ = a_ptr; // B持有A的shared_ptr return 0; }
在上述示例中,類A
和類B
相互持有對(duì)方的std::shared_ptr
。這樣就形成了循環(huán)引用,因?yàn)閮蓚€(gè)對(duì)象彼此引用對(duì)方的std::shared_ptr
,導(dǎo)致引用計(jì)數(shù)永遠(yuǎn)不會(huì)變?yōu)?,資源無法正確釋放。
當(dāng)main()
函數(shù)結(jié)束時(shí),a_ptr
和b_ptr
超出了作用域,它們的析構(gòu)函數(shù)被調(diào)用,但由于循環(huán)引用的存在,對(duì)象A
和B
的析構(gòu)函數(shù)不會(huì)被調(diào)用,資源無法被釋放,從而導(dǎo)致資源泄漏。
為了避免循環(huán)引用導(dǎo)致的資源泄漏,可以使用std::weak_ptr
來打破循環(huán)引用,如下所示:
#include <iostream> #include <memory> class A; class B; class A { public: std::shared_ptr<B> b_ptr_; A() { std::cout << "A constructor" << std::endl; } ~A() { std::cout << "A destructor" << std::endl; } }; class B { public: std::weak_ptr<A> a_ptr_; B() { std::cout << "B constructor" << std::endl; } ~B() { std::cout << "B destructor" << std::endl; } }; int main() { std::shared_ptr<A> a_ptr(new A()); std::shared_ptr<B> b_ptr(new B()); a_ptr->b_ptr_ = b_ptr; // A持有B的shared_ptr b_ptr->a_ptr_ = a_ptr; // B持有A的weak_ptr return 0; }
在上述示例中,類B
的成員變量a_ptr_
使用std::weak_ptr
來持有A
的弱引用,這樣不會(huì)增加A
對(duì)象的引用計(jì)數(shù)。當(dāng)A
對(duì)象被釋放時(shí),std::weak_ptr
會(huì)自動(dòng)失效,不會(huì)影響資源的釋放。這樣就打破了循環(huán)引用,避免了資源泄漏的問題。
到此這篇關(guān)于C++智能指針weak_ptr的作用詳解的文章就介紹到這了,更多相關(guān)C++智能指針weak_ptr內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++?TCP網(wǎng)絡(luò)編程詳細(xì)講解
TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會(huì)保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission?Control?Protocol,它是位于網(wǎng)絡(luò)OSI模型中的第四層2022-09-09