日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

9.C++弱引用智能指针weak_ptr的用处

發(fā)布時間:2025/3/21 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 9.C++弱引用智能指针weak_ptr的用处 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

weak_ptr也是一個引用計數型智能指針,但是它不增加對象的引用計數,即弱引用。與之相對,shared_ptr是強引用,只要有一個指向對象的shared_ptr存在,該對象就不會析構,直到指向對象的最后一個shared_ptr析構或reset()時才會被銷毀。

利用weak_ptr,我們可以解決常見的空懸指針問題以及循環(huán)引用問題

主要是利用了weak_ptr的lock()實現指針的提升!

空懸指針問題

什么是空懸指針?考慮以下這種情況:

有兩個指針p1和p2,指向堆上的同一個對象Object,p1和p2位于不同的線程中。假設線程A通過p1指針將對象銷毀了(盡管把p1置為了NULL),那p2就成了空懸指針。這是一種典型的C/C++內存錯誤。

使用weak_ptr能夠幫我們輕松解決上述的空懸指針問題。

weak_ptr不控制對象的生命期,但是它知道對象是否還活著。如果對象還活著,那么它可以提升為有效的shared_ptr(提升操作通過lock()函數獲取所管理對象的強引用指針);如果對象已經死了,提升會失敗,返回一個空的shared_ptr。示例代碼如下:

#include <iostream> #include <memory>int main() {// OLD, problem with dangling pointer// PROBLEM: ref will point to undefined data!int* ptr = new int(10);int* ref = ptr;delete ptr;// NEW// SOLUTION: check expired() or lock() to determine if pointer is valid// empty definitionstd::shared_ptr<int> sptr;// takes ownership of pointersptr.reset(new int);*sptr = 10;// get pointer to data without taking ownershipstd::weak_ptr<int> weak1 = sptr;// deletes managed object, acquires new pointersptr.reset(new int);*sptr = 5;// get pointer to new data without taking ownershipstd::weak_ptr<int> weak2 = sptr;// weak1 is expired!if(auto tmp = weak1.lock())std::cout << *tmp << '\n';elsestd::cout << "weak1 is expired\n";// weak2 points to new data (5)if(auto tmp = weak2.lock())std::cout << *tmp << '\n';elsestd::cout << "weak2 is expired\n"; }

循環(huán)引用問題

一種循環(huán)引用的情況如下:

#include <iostream> #include <memory>using namespace std;class Parent; class Child; typedef shared_ptr<Parent> parent_ptr; typedef shared_ptr<Child> child_ptr; class Parent { public:~Parent() { cout << "~Parent()" << endl; } public:child_ptr children; };class Child { public:~Child() { cout << "~Child()" << endl; } public:parent_ptr parent; };int main() {parent_ptr father(new Parent);child_ptr son(new Child);// 父子互相引用father->children = son;son->parent = father;cout << father.use_count() << endl; // 引用計數為2cout << son.use_count() << endl; // 引用計數為2return 0; }

如上代碼,將在程序退出前,father的引用計數為2,son的計數也為2,退出時,shared_ptr所作操作就是簡單的將計數減1,如果為0則釋放,顯然,這個情況下,引用計數不為0,于是造成father和son所指向的內存得不到釋放,導致內存泄露。

使用weak_ptr可以打破這樣的循環(huán)引用。由于弱引用不更改引用計數,類似普通指針,只要把循環(huán)引用的一方使用弱引用,即可解除循環(huán)引用。

以上述代碼為例,只要把Child類的代碼修改為如下即可:

class Child { public:~Child() { cout << "~Child()" << endl; } public:weak_ptr<Parent> parent; };

最后值得一提的是,雖然通過弱引用指針可以有效的解除循環(huán)引用,但這種方式必須在能預見會出現循環(huán)引用的情況下才能使用,即這個僅僅是一種編譯期的解決方案,如果程序在運行過程中出現了循環(huán)引用,還是會造成內存泄漏的。因此,不要認為只要使用了智能指針便能杜絕內存泄漏。

所以引用計數的方式還是會有內存泄漏的風險


?

總結

以上是生活随笔為你收集整理的9.C++弱引用智能指针weak_ptr的用处的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 9191久久 | 欧美精品五区 | 伊人成长网 | 射射av | 九九福利视频 | 日日射日日干 | 亚洲草逼 | 涩涩亚洲 | 精品一区二区三区中文字幕 | 制服.丝袜.亚洲.中文.综合懂 | 69视频污 | av观看国产 | 成人黄色在线视频 | 99久久久无码国产精品性色戒 | 91无毒不卡| 蜜臀av一区二区三区激情综合 | 女人下面无遮挡 | 冲田杏梨av| 8mav在线| 美女网站在线免费观看 | 亚洲视频一区二区在线观看 | 性色一区 | 亚洲影视网 | 少妇粉嫩小泬喷水视频www | 好吊操免费视频 | 欧美激情亚洲激情 | 双女主黄文 | 香蕉视频网站在线 | 亚洲网站免费看 | 爱看av在线| 人人艹在线观看 | 欧美亚洲综合视频 | 日韩第八页 | 成人福利视频 | 国产96在线| 91国内精品久久久久 | 日韩在线观看视频一区 | 黄色小视频在线看 | 一区二区三区精品视频在线观看 | 亚洲精品66 | 韩国伦理在线视频 | 夜久久 | 九九午夜视频 | fee性满足he牲bbw| 色呦呦一区二区三区 | 超碰蜜桃 | 给我看高清的视频在线观看 | 青青操影院| 日批小视频 | 一色综合 | 国产黄色av网站 | 96久久 | 久久人人艹 | 国产熟女精品视频 | 熟妇毛片 | 日韩精品欧美 | 日韩欧美字幕 | 97免费在线观看视频 | 午夜亚洲av永久无码精品 | 日韩男人的天堂 | 国模一区二区三区 | 欧美啪啪网| 杨幂毛片午夜性生毛片 | ww欧美| 欧美一级影院 | 亚洲精品无amm毛片 国内一区二区三区 | 伊人自拍 | 婷婷成人综合 | 国产爆乳无码一区二区麻豆 | 一本之道av | 亚洲一区二区三区免费看 | 亚洲无码精品在线播放 | www.日 | 免费观看成年人网站 | 成年人网站免费观看 | 欧美日本激情 | 日本一区二区三区在线观看视频 | 色视频线观看在线播放 | 极品三级 | 美女视频国产 | 国产精品制服诱惑 | 超碰一区二区 | 国产男男gay体育生白袜 | 三级黄色图片 | 最新国产精品自拍 | 欧美亚洲精品在线 | 巨乳美女被爆操 | 免费观看日韩毛片 | 国产乱国产乱老熟300部视频 | 午夜一级免费 | 一区二区视频在线看 | 久久国产视频精品 | 老熟妇毛片 | 乱子伦视频在线看 | 久久久久久国产精品三级玉女聊斋 | 在线污视频 | 成年黄色片 | 男人天堂亚洲天堂 | 奶水喷溅 在线播放 |