亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c++智能指針weak_ptr的使用

發布時間:2021-09-13 17:34:11 來源:億速云 閱讀:162 作者:chen 欄目:互聯網科技

本篇內容介紹了“c++智能指針weak_ptr的使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

智能指針 weak_ptr 使用

weak_ptr用途:

1,解決空懸指針問題
2,解決循環引用問題

weak_ptr特點:沒有*操作和->操作


weak_ptr是不控制所指對象生存周期的智能指針,它指向由一個shared_ptr管理的對象。將一個weak_ptr綁定到一個shared_ptr不會改變shared_ptr的計數器。一旦最后一個指向對象的shared_ptr被銷毀,對象就會被釋放,即使有weak_ptr指向這個對象,對象也會被釋放。

一,先來個表格,嘮嘮weak_ptr

操作功能描述
weak_ptr<T> w空weak_ptr,可以指向類型為T*的對象。
weak_ptr<T> w(sp)與shared_sp sp指向相同對象的weak_ptr。T必須能轉換為sp所指的類型。
w = pp可以是一個shared_ptr或一個weak_ptr。賦值后w指向p所指的對象。
w.reset()將w置為空
w.use_count()與w共享對象的shared_ptr的數量
w.expired()若w.use_count()為0,返回true,否則返回false
w.lock()如果expired()為true,返回一個空shared_ptr;否則返回一個指向w所指對象的shared_ptr。
小例子索引
代碼塊功能描述
test1weak_ptr不增加引用計數
test2weak_ptr沒有->和*操作
test3lock使用
test4循環引用,導致即使是智能指針也不能釋放內存。用weak_ptr解決了循環引用,導致的內存不能釋放的問題
小例子
#include <iostream> #include <memory> #include <vector> using namespace std; class Test{ public: Test(int d = 0) : data(d){cout << "new" << data << endl;} ~Test(){cout << "del" << data << endl;} void func(){cout << "func" << endl;} private: int data; }; //test4 循環引用,導致即使是智能指針也不能釋放內存  class teacher; class student; class teacher{ public: teacher(){cout << "teacher()" << endl;} ~teacher(){cout << "del teacher" << endl;} shared_ptr<student> stu; }; class student{ public: student(){cout << "student()" << endl;} ~student(){cout << "del student" << endl;} //如果換成shared_ptr<teacher> tea;就會形成循環引用,導致內存泄漏  weak_ptr<teacher> tea; }; int main(){ //test1 weak_ptr不增加引用計數  /* shared_ptr<Test> sp1 = make_shared<Test>(1); cout << sp1.use_count() << endl;//1 weak_ptr<Test> wp1 = sp1; cout << wp1.use_count() << endl;//1 */ //test2 weak_ptr沒有->和*操作  //wp1->func();  //(*wp1).func();  //test3 lock使用  /* shared_ptr<int> sptr; sptr.reset(new int); *sptr = 10; weak_ptr<int> weak1 = sptr; sptr.reset(new int); *sptr = 5; weak_ptr<int> weak2 = sptr; // weak1 is expired! if(auto tmp = weak1.lock()) cout << *tmp << '\n'; else cout << "weak1 is expired\n"; // weak2 points to new data (5) if(auto tmp = weak2.lock()) cout << *tmp << '\n'; else cout << "weak2 is expired\n"; */ //test4 循環引用,導致即使是智能指針也不能釋放內存  //用weak_ptr解決了循環引用,導致的內存不能釋放的問題  shared_ptr<teacher> tptr(new teacher);//計數器1  shared_ptr<student> sptr(new student);//計數器1  tptr->stu = sptr;//sptr的計數器2  sptr->tea = tptr;//不增加tptr的引用計數,因為tea是weak指針  cout << tptr.use_count() << endl;//1  cout << sptr.use_count() << endl;//2  return 0; }

“c++智能指針weak_ptr的使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

台江县| 喀喇| 马鞍山市| 微山县| 东乡县| 怀柔区| 哈巴河县| 舒城县| 鲜城| 镇康县| 平阴县| 山西省| 祁东县| 万宁市| 山阴县| 鄢陵县| 凤庆县| 南投市| 高邮市| 佛山市| 余庆县| 牟定县| 错那县| 洛浦县| 新源县| 子长县| 洪雅县| 平南县| 滁州市| 卢龙县| 和平区| 白朗县| 江陵县| 调兵山市| 镇宁| 青州市| 外汇| 崇州市| 磐安县| 城步| 德安县|