您好,登錄后才能下訂單哦!
本篇內容介紹了“c++智能指針weak_ptr的使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
操作 | 功能描述 |
---|---|
weak_ptr<T> w | 空weak_ptr,可以指向類型為T*的對象。 |
weak_ptr<T> w(sp) | 與shared_sp sp指向相同對象的weak_ptr。T必須能轉換為sp所指的類型。 |
w = p | p可以是一個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。 |
代碼塊 | 功能描述 |
---|---|
test1 | weak_ptr不增加引用計數 |
test2 | weak_ptr沒有->和*操作 |
test3 | lock使用 |
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的使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。