欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

珍愛生命,遠(yuǎn)離野指針

系統(tǒng) 2476 0

Background

估計只要是C++程序員,沒有一個不痛恨這個野指針啦,而對于我們這種只能通過log來debug的程序員來說,其恨更深。

Solution

每次看到形如下面的代碼時

A* p1 = new A;

A* p2 = p1;

delete p1;

我都有一種想要將p2也置成空的沖動,但往往都不遂我心愿,因為在實際中p1,p2的出現(xiàn)實在是神出鬼沒,讓你防不勝防也煩不勝煩。

魯迅先生說過: 不在沉默中暴發(fā)就在沉默中滅亡。幸好,我沒有滅亡,所以我要暴發(fā)。

在防夠了,煩飽了以后,我下定決心,要端掉這個讓我受盡折磨地暗堡。

復(fù)雜問題的解決方案往往都是簡單而“暴力”地,因為問題的難解決一般來說都是因為”暴力”無處著力。我堅信這個規(guī)則,所以我的思路很簡單,就是要在delete p1的時候把p2也置為空。

計算機科學(xué)中有個神話般的格言:計算機科學(xué)中的大部分問題都可以通過增加一個中間層來解決。我希望這一次神話能得以延續(xù)。

好了,想想吧,我們要解決的問題實際上只有一個,那就是要找一個機制,讓p2能知悉它所指向?qū)ο蟮臓顟B(tài)(在這里是生命周期)。如果我們把A的生命周期作為一個類提出來,把它叫LifeObject吧,并給每個A的實例一個配備一個LifeObject對象,再讓p1和p2指向這個生命周期對象,這樣我們只須在A的構(gòu)造函數(shù)中創(chuàng)建一個LifeObject對象,在析構(gòu)函數(shù)中將告訴LifeObject,這樣在使用p1和p2的時候就知道當(dāng)前使用的指針是否是有效的啦。

其關(guān)系示意如下:

珍愛生命,遠(yuǎn)離野指針

Implement

思路有了,就像有了作戰(zhàn)計劃,那當(dāng)然要開始行軍了:

那個示意圖告訴了我們致少4件事:

  1. p1,p2現(xiàn)在不能是指向A的裸指針啦,因為一個裸指針無法自己做到從LifeObject中獲取相應(yīng)的信息。需要封裝一下,就叫SafePtr吧;
  2. SafePtr要提供銷毀A的方法,取名為Destroy;
  3. LifeObject是有引用計數(shù)的,因為它要負(fù)責(zé)在A銷毀之后,通知p1,p2,…pn,同時它還必須是創(chuàng)建在heap上的;
  4. LifeObject中要有A的狀態(tài)信息,在A構(gòu)造函數(shù)中新建LifeObject時將其狀態(tài)信息置為valid,在A析構(gòu)時置為invalid。

最后,其結(jié)構(gòu)圖大致如下:

珍愛生命,遠(yuǎn)離野指針

從這個結(jié)構(gòu)圖上,我們可以看到:

  1. LifeObject是用SafeObject的一個指針m_pPointee來指示SafeObject的狀態(tài)的,在SafeObject創(chuàng)建時把自己的地址賦給m_pPointee,在析構(gòu)時將m_pPointee設(shè)為NULL;
  2. 通過將LifeObject的析構(gòu)函數(shù)設(shè)為私有,并提供銷毀方法Destroy,可以保證它只能在heap上創(chuàng)建,同時除了它的friend SafeObject以外沒有人能創(chuàng)建它。
  3. SafePtr提供了判空函數(shù)IsNUll和NotNull;

在具體實現(xiàn)的時候,還要考慮的問題是SafePtr要像裸指針一樣,能夠從SafePtr<Derived>轉(zhuǎn)化為SafePtr<Base>以及從SafePtr<Base> 安全轉(zhuǎn)換到SafePtr<Derived>一些事。大家可以參見其源碼

How to use it?

  1. 首先你要讓你的類繼承處SafeObject,如下:

class Test: public SafeObject

  1. 像使用智能指針一樣使用它

SafePtr<Test> pp(new Test);

SafePtr<Test> pp1 = pp;

if(pp1.NotNull())

{

pp1->output();

pp1->Fun();

SafePtr<SafeObject> pp3(pp);

cout<<pp3->test()<<endl;

}

pp.Destroy();

if(pp1.NotNull())

{

pp1->Fun();

}

Test Code如下:

        


Advantage

我想大家已經(jīng)看出來了,接口的定義和智能指針很相似,只是多了一個Destroy函數(shù)而已,所以它的優(yōu)點就有兩個啦:

  1. 野指針在這兒灰飛煙滅了;
  2. 如果不調(diào)用destroy函數(shù),它就是一智能指針,用它可以防止內(nèi)存泄漏。

Disadvantage

雖然它解決了C++中兩大問題,但是它的缺點也是有目共睹的,除了常規(guī)智能指針的缺陷外它還多出了兩個:

  1. 不能調(diào)用delete來銷毀一個指針,你要通通換成對Destroy函數(shù)的的調(diào)用;
  2. 如果你想要享受特權(quán)公民的待遇,你就得讓你的類從SafeObject繼承一下。

珍愛生命,遠(yuǎn)離野指針


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美精品黄页在线观看大全 | 色多多视频导航 | 国产精品国产三级国产aⅴ入口 | 国产欧美日韩精品一区二 | 欧美日韩中文字幕 | 精品一区二区高清在线观看 | 久久久久久一级毛片免费野外 | 波多野结衣全部系列在线观看 | 日本黄页免费大片在线观看 | 老牛影视av一区二区在线观看 | 精彩视频一区 | 免费黄色a视频 | 免费特黄一级欧美大片在线看 | 国产裸体bbb视频 | 日韩黄色一级视频 | 中文字幕精品一区二区三区精品 | 欧美激情视频二区三区 | 一本色道久久88加勒比—综合 | 99久久精品国产一区二区三区 | 日产乱码卡一卡2卡三卡四麻豆 | 99色综合| 国内精品久久久久久中文字幕 | 午夜视频在线免费观看 | 国产成人精品日本亚洲麻豆 | 亚洲国产欧美久久香综合 | ⅴideo裸体秀hd | 免费一级做a爰片性视频 | 日韩欧美福利视频 | 美女国产一区 | 久草免费福利资源站 | 黄色a视频 | 日韩欧美一区在线观看 | 日日碰狠狠添天天爽五月婷 | 国产成人无码区免费内射一片色欲 | 色婷婷视频在线 | 瑟瑟综合 | 91精品国产闺蜜国产在线 | 日本九九视频 | aaqqw| 久草中文在线 | 久久精品免费一区二区三 |