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

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

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

2020-01-26 14:18:25
字體:
來源:轉載
供稿:網友

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++ 智能指針及 循環引用的問題全部內容了,希望大家多多支持武林網~

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美中文字幕第一页| 韩曰欧美视频免费观看| 欧美视频精品一区| 亚洲女性裸体视频| 亚洲人午夜精品| 97久久伊人激情网| 国产成人精品视频在线| 97视频免费在线观看| 欧美在线视频观看免费网站| 在线成人一区二区| 91精品中国老女人| 少妇激情综合网| 欧美成人h版在线观看| 欧美色另类天堂2015| 久久久极品av| 日韩中文字幕av| 菠萝蜜影院一区二区免费| 欧美肥臀大乳一区二区免费视频| 4438全国亚洲精品在线观看视频| 久久久久久美女| 日本精品视频在线观看| 亚洲直播在线一区| 精品欧美国产一区二区三区| 久久伊人91精品综合网站| 精品久久久免费| 亚洲国产欧美一区二区三区久久| 精品久久久久久久久久久| 九九综合九九综合| 欧美激情一区二区三级高清视频| 日韩视频亚洲视频| 久久精品国产成人精品| 国产成人久久久精品一区| 久久久国产精彩视频美女艺术照福利| 国产精品免费视频久久久| 青青久久av北条麻妃海外网| 夜色77av精品影院| 久久久久久久激情视频| 国产精品一区二区久久精品| 在线观看欧美www| 久久综合免费视频影院| 欧美高跟鞋交xxxxhd| 国产亚洲视频在线观看| 日韩视频在线免费观看| 欧美情侣性视频| 欧美黑人极品猛少妇色xxxxx| 国产精品国产亚洲伊人久久| 国产日韩在线精品av| 成人免费看片视频| 亚洲 日韩 国产第一| 成人在线视频网| 日韩免费av一区二区| 久久久久中文字幕| 欧美怡春院一区二区三区| 国产精品96久久久久久又黄又硬| 欧美激情中文字幕在线| 欧美与黑人午夜性猛交久久久| 欧美日韩国产专区| 国产精品永久免费观看| 欧美成人性生活| 中文字幕在线视频日韩| 亚洲成人免费在线视频| 亚州成人av在线| 欧洲成人免费aa| 久久久久久久国产| 91中文字幕在线观看| 国产精品96久久久久久又黄又硬| 日韩一级裸体免费视频| 成人黄色中文字幕| 午夜精品久久久久久99热| 亚洲精品永久免费精品| 亚洲第一二三四五区| 91大神在线播放精品| 欧美午夜激情小视频| 日本精品视频在线观看| 欧美中文字幕视频| 91久久精品在线| 国产精品福利在线观看网址| 欧美亚洲在线播放| 成人黄色大片在线免费观看| 久久精品视频在线播放| 午夜精品久久久久久久久久久久久| 国产精品27p| 久久久人成影片一区二区三区| 成人av资源在线播放| 日韩国产欧美区| 国产成人啪精品视频免费网| 日韩精品在线视频| 亚洲激情在线视频| 欧美激情网友自拍| 久久亚洲春色中文字幕| 欧美精品18videos性欧| 992tv成人免费影院| 上原亚衣av一区二区三区| 色偷偷综合社区| 欧美日韩国产精品一区| 清纯唯美亚洲综合| 欧洲成人午夜免费大片| 中文字幕亚洲字幕| 久久精品视频免费播放| 成人福利免费观看| 日韩免费电影在线观看| 日韩av在线导航| 伊人久久精品视频| 亚洲偷熟乱区亚洲香蕉av| 欧美性猛交xxxx乱大交极品| 日韩一区av在线| 日本欧美中文字幕| 欧美日韩国产综合新一区| 在线亚洲午夜片av大片| 欧美色xxxx| 国产成人鲁鲁免费视频a| 欧美激情精品久久久久久黑人| 国产精品久久久久久搜索| 91在线免费观看网站| 成人免费激情视频| 国产精品美女主播| 日韩欧美主播在线| 亚洲电影免费观看高清完整版| 日韩精品在线观看一区二区| 午夜精品一区二区三区av| 国产精品影片在线观看| 一本色道久久综合狠狠躁篇的优点| 日韩欧美在线免费观看| 深夜精品寂寞黄网站在线观看| 日韩欧美精品中文字幕| 欧美成人精品在线| 国产欧美最新羞羞视频在线观看| 北条麻妃99精品青青久久| 日韩中文字幕欧美| 色综合伊人色综合网| 亚洲午夜av电影| 国产成人a亚洲精品| 欧美大胆在线视频| 国内精品美女av在线播放| 亚洲精品日韩av| 麻豆成人在线看| 黄色成人av在线| 在线视频免费一区二区| 欧美日韩国产激情| 91久久久久久久一区二区| 国产精品va在线| 国产日韩在线精品av| 日韩欧美国产成人| 国产在线拍揄自揄视频不卡99| 欧洲日本亚洲国产区| 亚洲成人av资源网| 91精品久久久久久久久久久久久| 久久九九全国免费精品观看| 亚洲国产古装精品网站| 成人美女免费网站视频| 亚洲女人天堂成人av在线| 欧美xxxx做受欧美.88| 精品国产一区二区三区四区在线观看| 国产亚洲在线播放| 欧美激情视频三区| 亚洲精品之草原avav久久| 国产成人av在线| 在线视频欧美日韩精品| 亚洲精品ady| 亚洲精品乱码久久久久久金桔影视| 久久人人爽人人爽人人片av高请| xxav国产精品美女主播| 国产精品一二三在线| 成人午夜两性视频|