c++++中shared_ptr的循環(huán)引用問題會導(dǎo)致內(nèi)存泄漏,解決方法是使用weak_ptr。①循環(huán)引用發(fā)生在兩個或多個shared_ptr相互持有對方,引用計(jì)數(shù)無法歸零;②weak_ptr不增加引用計(jì)數(shù),僅用于臨時訪問對象,通過lock()獲取shared_ptr;③修改類定義,將其中一個shared_ptr改為weak_ptr即可打破循環(huán);④使用weak_ptr時應(yīng)注意不能直接操作對象、避免頻繁調(diào)用lock()、合理判斷是否需要強(qiáng)引用;⑤常見踩坑場景包括觀察者模式、樹形結(jié)構(gòu)回指和緩存系統(tǒng),應(yīng)優(yōu)先考慮是否需要強(qiáng)引用以避免不必要的依賴。
C++中,
shared_ptr
shared_ptr
解決辦法是使用
weak_ptr
最典型的場景就是兩個類之間相互持有
shared_ptr
立即學(xué)習(xí)“C++免費(fèi)學(xué)習(xí)筆記(深入)”;
class B; // 前向聲明 class A { public: shared_ptr<B> ptr; }; class B { public: shared_ptr<A> ptr; };
如果創(chuàng)建兩個對象并讓它們互指:
auto a = make_shared<A>(); auto b = make_shared<B>(); a->ptr = b; b->ptr = a;
這時候,
a
b
用一句話說:weak_ptr
修改上面的例子很簡單,把其中一個改為
weak_ptr
class B; // 前向聲明 class A { public: shared_ptr<B> ptr; }; class B { public: weak_ptr<A> ptr; // 改成 weak_ptr };
這樣,當(dāng)
a
b
ptr
a
lock()
shared_ptr
if (auto aPtr = b->ptr.lock()) { // aPtr 是一個有效的 shared_ptr,可以安全使用 } else { // 對象已經(jīng)被釋放 }
weak_ptr
operator->
operator*
lock()
shared_ptr
weak_ptr
比如下面這段代碼就有點(diǎn)濫用:
for (int i = 0; i < 100000; ++i) { auto tmp = myWeakPtr.lock(); // 每次都 lock,效率低 if (tmp) tmp->doSomething(); }
應(yīng)該改成:
if (auto tmp = myWeakPtr.lock()) { for (int i = 0; i < 100000; ++i) { tmp->doSomething(); // 只 lock 一次 } }
shared_ptr
shared_ptr
weak_ptr
shared_ptr
遇到這些情況時,不妨多問一句:我這里真的需要一個強(qiáng)引用嗎?如果不是必須的,就該換成
weak_ptr
基本上就這些。
weak_ptr
shared_ptr
以上就是C++ shared_ptr循環(huán)引用怎么辦 weak_ptr解決方案詳解的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進(jìn)程會占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號