C++笔记-shared_ptr与weak_ptr需要注意的地方
生活随笔
收集整理的這篇文章主要介紹了
C++笔记-shared_ptr与weak_ptr需要注意的地方
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
?
基本概念
代碼與實例
?
基本概念
share_ptr使用的是引用計數,每一個shared_ptr都指向相同的內存。只有最后一個shared_ptr析構的時候,才會釋放內存,不建議直接用shared_ptr作為函數參數進行傳遞,尤其是復雜類型。
還要注意循環引用的問題。
如下的方式,就不建議使用:
struct StructA{StructA(){} };void fun(std::shared_ptr<int> p, StructA *obj){...... }下面演示下shared_ptr與weak_ptr以及循環引用問題及如何進行解決。
?
代碼與實例
shared_ptr的基本用法!
運行截圖如下:
源碼如下:
#include <iostream> #include <memory> using namespace std;struct A{A(){cout << "A() called!" << endl;}~A(){cout << "~A() called!" << endl;} };int main() {cout << "begin" << endl;{shared_ptr<A> p(new A);}cout << "over" << endl;return 0; }?從中可以看到,當周期結束后,shared_ptr會被自動釋放!
下面是循環引用的問題!
如下代碼:
#include <iostream> #include <memory> using namespace std; struct B;struct A{shared_ptr<B> bPtr;A(){cout << "A() called!" << endl;}~A(){cout << "~A() called!" << endl;} };struct B{shared_ptr<A> aPtr;B(){cout << "B() called!" << endl;}~B(){cout << "~B() called!" << endl;} };int main() {cout << "begin" << endl;{shared_ptr<A> aP(new A);shared_ptr<B> bP(new B);aP->bPtr = bP;bP->aPtr = aP;}cout << "over" << endl;return 0; }運行截圖如下:
從中可見,這兩個結構體沒有被釋放。
引入weak_ptr可以解決循環引用的問題:
其他源碼不變,修改一個為weak_ptr即可
運行截圖如下:
?
總結
以上是生活随笔為你收集整理的C++笔记-shared_ptr与weak_ptr需要注意的地方的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot中登录错误消息的显
- 下一篇: 前端笔记-vue中引入Bootstrap