亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

關于c++ 智能指針及 循環引用的問題

2020-05-23 13:55:17
字體:
來源:轉載
供稿:網友

c++智能指針介紹

由于 C++ 語言沒有自動內存回收機制,程序員每次 new 出來的內存都要手動 delete,比如流程太復雜,最終導致沒有 delete,異常導致程序過早退出,沒有執行 delete 的情況并不罕見,并造成內存泄露。如此c++引入 智能指針 ,智能指針即是C++ RAII的一種應用,可用于動態資源管理,資源即對象的管理策略。 智能指針在 <memory>標頭文件的 std 命名空間中定義。 它們對 RAII 或 獲取資源即初始化 編程慣用法至關重要。 RAII 的主要原則是為所有堆分配資源提供所有權,例如動態分配內存或系統對象句柄、析構函數包含要刪除或釋放資源的代碼的堆棧分配對象,以及任何相關清理代碼。

c++智能指針類別

c++ 智能指針主要包括:unique_ptr,shared_ptr, weak_ptr, 這三種,其中auto_ptr 已被遺棄。

unique_ptr

只允許基礎指針的一個所有者。 可以移到新所有者(具有移動語義),但不會復制或共享(即我們無法得到指向同一個對象的兩個unique_ptr)。 替換已棄用的 auto_ptr。 相較于 boost::scoped_ptr。 unique_ptr 小巧高效;大小等同于一個指針,支持 rvalue 引用,從而可實現快速插入和對 STL 集合的檢索。 頭文件:<memory>。

使用unique_ptr,可以實現以下功能:

1、為動態申請的內存提供異常安全。
2、將動態申請內存的所有權傳遞給某個函數。
3、從某個函數返回動態申請內存的所有權。
4、在容器中保存指針。
5、所有auto_ptr應該具有的(但無法在C++ 03中實現的)功能。

如下代碼所示:

class A;// 如果程序執行過程中拋出了異常,unique_ptr就會釋放它所指向的對象// 傳統的new 則不行unique_ptr<A> fun1(){ unique_ptr p(new A); //do something return p;}void fun2(){  // unique_ptr具有移動語義 unique_ptr<A> p = f();// 使用移動構造函數 // do something}// 在函數退出的時候,p以及它所指向的對象都被刪除釋放 shared_ptr 

 


采用引用計數的智能指針。 shared_ptr基于“引用計數”模型實現,多個shared_ptr可指向同一個動態對象,并維護了一個共享的引用計數器,記錄了引用同一對象的shared_ptr實例的數量。當最后一個指向動態對象的shared_ptr銷毀時,會自動銷毀其所指對象(通過delete操作符)。shared_ptr的默認能力是管理動態內存,但支持自定義的Deleter以實現個性化的資源釋放動作。頭文件:<memory>。

基本操作:shared_ptr的創建、拷貝、綁定對象的變更(reset)、shared_ptr的銷毀(手動賦值為nullptr或離開作用域)、指定deleter等操作。

shared_ptr的創建,有兩種方式,

一,使用函數make_shared(會根據傳遞的參數調用動態對象的構造函數);

二,使用構造函數(可從原生指針、unique_ptr、另一個shared_ptr創建)

shared_ptr<int> p1 = make_shared<int>(1);// 通過make_shared函數

shared_ptr<int> p2(new int(2));// 通過原生指針構造此外智能指針若為“空“,即不指向任何對象,則為false,否則為true,可作為條件判斷??梢酝ㄟ^兩種方式指定deleter,一是構造shared_ptr時,二是使用reset方法時??梢灾剌d的operator->, operator *,以及其他輔助操作如unique()、use_count(), get()等成員方法。

weak_ptr

結合 shared_ptr 使用的特例智能指針。 weak_ptr 提供對一個或多個 shared_ptr 實例所屬對象的訪問,但是,不參與引用計數。 如果您想要觀察對象但不需要其保持活動狀態,請使用該實例。 在某些情況下需要斷開 shared_ptr 實例間的循環引用。 頭文件:<memory>。

weak_ptr的用法如下:

weak_ptr用于配合shared_ptr使用,并不影響動態對象的生命周期,即其存在與否并不影響對象的引用計數器。weak_ptr并沒有重載operator->和operator *操作符,因此不可直接通過weak_ptr使用對象。提供了expired()與lock()成員函數,前者用于判斷weak_ptr指向的對象是否已被銷毀,后者返回其所指對象的shared_ptr智能指針(對象銷毀時返回”空“shared_ptr)。循環引用的場景:如二叉樹中父節點與子節點的循環引用,容器與元素之間的循環引用等。

智能指針的循環引用

循環引用問題可以參考 這個鏈接 上的問題理解,“循環引用”簡單來說就是:兩個對象互相使用一個shared_ptr成員變量指向對方的會造成循環引用。導致引用計數失效。下面給段代碼來說明循環引用:

#include <iostream>#include <memory>using namespace std;class B;class A{public:// 為了省去一些步驟這里 數據成員也聲明為public //weak_ptr<B> pb; shared_ptr<B> pb; void doSomthing() {// if(pb.lock())// {//// } } ~A() { cout << "kill A/n"; }};class B{public: //weak_ptr<A> pa; shared_ptr<A> pa; ~B() { cout <<"kill B/n"; }};int main(int argc, char** argv){ shared_ptr<A> sa(new A()); shared_ptr<B> sb(new B()); if(sa && sb) { sa->pb=sb; sb->pa=sa; } cout<<"sa use count:"<<sa.use_count()<<endl; return 0;}

 

上面的代碼運行結果為:sa use count:2, 注意此時sa,sb都沒有釋放,產生了內存泄露問題?。?!

即A內部有指向B,B內部有指向A,這樣對于A,B必定是在A析構后B才析構,對于B,A必定是在B析構后才析構A,這就是循環引用問題,違反常規,導致內存泄露。

一般來講,解除這種循環引用有下面有三種可行的方法( 參考 ):

1 . 當只剩下最后一個引用的時候需要手動打破循環引用釋放對象。

2 . 當A的生存期超過B的生存期的時候,B改為使用一個普通指針指向A。

3 . 使用弱引用的智能指針打破這種循環引用。

雖然這三種方法都可行,但方法1和方法2都需要程序員手動控制,麻煩且容易出錯。我們一般使用第三種方法:弱引用的智能指針weak_ptr。

強引用和弱引用

一個強引用當被引用的對象活著的話,這個引用也存在(就是說,當至少有一個強引用,那么這個對象就不能被釋放)。share_ptr就是強引用。相對而言,弱引用當引用的對象活著的時候不一定存在。僅僅是當它存在的時候的一個引用。弱引用并不修改該對象的引用計數,這意味這弱引用它并不對對象的內存進行管理,在功能上類似于普通指針,然而一個比較大的區別是,弱引用能檢測到所管理的對象是否已經被釋放,從而避免訪問非法內存。

使用weak_ptr來打破循環引用

代碼如下:

#include <iostream>#include <memory>using namespace std;class B;class A{public:// 為了省去一些步驟這里 數據成員也聲明為public weak_ptr<B> pb; //shared_ptr<B> pb; void doSomthing() { if(pb.lock()) { } } ~A() { cout << "kill A/n"; }};class B{public: //weak_ptr<A> pa; shared_ptr<A> pa; ~B() { cout <<"kill B/n"; }};int main(int argc, char** argv){ shared_ptr<A> sa(new A()); shared_ptr<B> sb(new B()); if(sa && sb) { sa->pb=sb; sb->pa=sa; } cout<<"sb use count:"<<sb.use_count()<<endl; return 0;}

以上就是小編為大家帶來的關于c++ 智能指針及 循環引用的問題全部內容了,希望大家多多支持VEVB武林網~


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色综合久久悠悠| 亚洲精品小视频在线观看| 国产精品美女免费视频| 国产一区在线播放| 国产精品视频自在线| 夜夜嗨av一区二区三区免费区| 最近的2019中文字幕免费一页| 亚洲国产99精品国自产| 久久久精品国产亚洲| 国产成人免费av电影| 尤物tv国产一区| 精品国产福利在线| 欧美裸体xxxx极品少妇软件| 精品美女国产在线| 亚洲第一页自拍| 国产美女久久精品| 亚洲免费视频观看| 久久精品小视频| 国产xxx69麻豆国语对白| 日本成熟性欧美| 欧美视频在线看| 欧美视频专区一二在线观看| 国产aⅴ夜夜欢一区二区三区| 欧美激情精品久久久久久| 亚洲精品美女网站| 一本色道久久综合亚洲精品小说| 亚洲精品成人免费| 在线播放精品一区二区三区| www.国产精品一二区| 色无极亚洲影院| 久久久久久国产精品美女| 欧美日本啪啪无遮挡网站| 国产精品老女人精品视频| 丁香五六月婷婷久久激情| 狠狠久久五月精品中文字幕| 久久久av电影| 精品免费在线观看| 亚洲色图五月天| 91国自产精品中文字幕亚洲| 国产精品久久77777| 国产视频精品自拍| xxxxxxxxx欧美| 宅男66日本亚洲欧美视频| 亚洲国产美女久久久久| 91成人天堂久久成人| 97成人精品视频在线观看| 一道本无吗dⅴd在线播放一区| 欧美激情精品久久久久久变态| 久久九九有精品国产23| 日韩av在线免播放器| 欧美久久精品一级黑人c片| 欧美日产国产成人免费图片| 亚洲综合精品伊人久久| 国产亚洲激情视频在线| 欧美极度另类性三渗透| 欧美日韩激情网| 深夜福利日韩在线看| 亚洲国产精品va在线看黑人动漫| 国产一区二区色| 另类视频在线观看| 国产一区二区成人| 日韩有码在线观看| 亚洲国语精品自产拍在线观看| 欧美激情女人20p| 亚洲欧洲高清在线| 中文字幕欧美视频在线| 中文字幕九色91在线| 欧美日韩午夜激情| 久久久久久久国产| 这里只有精品在线播放| 一区二区三区亚洲| 九色精品美女在线| 97国产精品视频| 91久久精品日日躁夜夜躁国产| 国产精品入口尤物| 国产成人精品电影久久久| 欧美性生活大片免费观看网址| 韩国19禁主播vip福利视频| 国产69久久精品成人看| 久久精品久久久久| 91精品国产色综合久久不卡98口| 亚洲第一网站男人都懂| 欧美高清videos高潮hd| 国产婷婷色综合av蜜臀av| 成人444kkkk在线观看| 亚洲精品成人久久电影| 亚洲成人a级网| 中文字幕综合一区| 日韩av免费在线播放| 日韩av不卡在线| 欧美性生交xxxxx久久久| 中文字幕亚洲色图| 欧美三级欧美成人高清www| 日韩成人xxxx| 国产精品久久久久av免费| 国产午夜精品一区二区三区| 国产欧美一区二区三区四区| 国产精品美女主播在线观看纯欲| 亚洲精品视频在线观看视频| 久久久久久久久电影| 欧美一级高清免费播放| 日韩精品中文在线观看| 欧美老女人性视频| 韩国三级电影久久久久久| 日韩电影在线观看免费| 九九热这里只有在线精品视| 伊人久久久久久久久久久久久| 国产精品va在线| 亚洲成人av中文字幕| 日本不卡高字幕在线2019| 亚洲国产精品99久久| 欧美韩国理论所午夜片917电影| 欧美性猛交xxxx乱大交极品| 欧美性猛交xxxx乱大交极品| 最近2019中文字幕大全第二页| 久久精品中文字幕| 国产精品网红直播| 97色在线观看免费视频| 秋霞成人午夜鲁丝一区二区三区| 国产精品人人做人人爽| 日韩中文字幕视频在线观看| 国产精品日韩av| 狠狠色香婷婷久久亚洲精品| 日韩精品视频在线观看网址| 欧美一区深夜视频| 国产福利精品av综合导导航| 亚洲免费伊人电影在线观看av| 国产一区红桃视频| 成人a视频在线观看| 欧美成人午夜剧场免费观看| 久久精品精品电影网| 97超视频免费观看| 欧美视频在线观看免费网址| 91麻豆国产语对白在线观看| 国产亚洲aⅴaaaaaa毛片| 亚洲视频在线看| 亚洲第一精品电影| 欧美激情手机在线视频| 精品高清一区二区三区| 国产欧美一区二区白浆黑人| 日韩视频中文字幕| 红桃av永久久久| 欧美美女操人视频| 国产午夜精品美女视频明星a级| 欧美激情小视频| 最新国产成人av网站网址麻豆| 亚洲精品久久久一区二区三区| 亚洲va国产va天堂va久久| 一区二区三区回区在观看免费视频| 日韩国产精品亚洲а∨天堂免| 精品日韩美女的视频高清| 欧美资源在线观看| 亚洲а∨天堂久久精品9966| 欧美日韩美女在线| 久久久久久久久91| 久久视频这里只有精品| 综合网中文字幕| 欧美夫妻性生活视频| 久久精品夜夜夜夜夜久久| 日韩av网址在线| 91中文在线视频| 国产精品欧美久久久| 亚洲视频国产视频| 欧美性猛交xxxx乱大交|