青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

熱轉(zhuǎn)印www.yxheatpress.com

公司網(wǎng)站模板http://qiyemoban.software8.co/

常用鏈接

統(tǒng)計

友情鏈接

最新評論

C++中動態(tài)資源管理

昨天看到一個知識點覺得挺有意思的,而且自己還不是很清楚,覺得講得很好。主題是“以對象來管理資源”

C++中用得最多的就是動態(tài)的內(nèi)存分配,程序中的大部分bug也都是源自于內(nèi)存泄露,這也是C++相較于其他高級語言更復(fù)雜的主要原因之一,不過考慮到它強(qiáng)大的功能和超高的效率,這樣的復(fù)雜度也是應(yīng)該的,所以上天是公平的,有點扯遠(yuǎn)了。內(nèi)存只是我們必須管理的資源之一,其他常用到的資源還包括文件描述符,數(shù)據(jù)庫連接,socket等,不論是哪種資源,我們用完之后必須要歸還給操作系統(tǒng),否則就會出現(xiàn)Memory Leak

看下面一段代碼:

#include <iostream>

using namespace std;

class Widget

{

public:

      Widget()

      {

        cout<<"Widget()"<<endl;

      }

 

      ~Widget()

      {

        cout<<"~Widget()"<<endl;

      }

 

};

 

 

Widget* CreateWidget()

{

   Widget* pA = new Widget;

   return pA;

}

void MaybeMemoryLeak()

{

   Widget* p = CreateWidget();

   //....

   //....

   //....

   if(p!=NULL)

      return;

   delete p;

}

int main()

{

    MaybeMemoryLeak();

    cout << "Hello world!" << endl;

    return 0;

}

乍一看,這段代碼沒有什么問題,仔細(xì)一想,這段代碼確實有問題,而且問題很大。在函數(shù)“MaybeMemoryLeak()”中極有可能發(fā)生內(nèi)存泄露,這段代碼執(zhí)行下來析構(gòu)函數(shù)沒有被調(diào)用,也就是發(fā)生了內(nèi)存泄露。原因就在于delete p之前函數(shù)已經(jīng)返回了,所以delete p不會執(zhí)行。

有人肯定會說只要保證在delete p之前不執(zhí)行return語句就可以了。貌似是這樣,但是如果程序都如我們所預(yù)想的邏輯那樣跑,那也就沒有bug一說了。即使我們在delete p之前保證沒有return語句,那么第二種可能是delete p語句位于循環(huán)內(nèi)部,然而循環(huán)可能在delete p之前執(zhí)行了continue語句或break語句而提前退出,這樣勢必也會發(fā)生內(nèi)存泄露。有人說我也能保證這種情況不會發(fā)生,那么好吧,假如delete p語句之前的代碼發(fā)生了異常,那么delete p語句仍然執(zhí)行不到,我相信任何人沒有敢拍著胸脯說他寫的代碼不會發(fā)生異常吧。

所以這幾種情況造成了我們動態(tài)分配的內(nèi)存很容易發(fā)生不能正確回收,從而造成內(nèi)存泄露。

 

好了,下面進(jìn)入本文真正的主題,以對象來管理資源。

根據(jù)對上面代碼的分析,為了確保函數(shù)CreateWidget()返回的資源總是能被正確釋放,我們需要將分配的資源放進(jìn)對象內(nèi),當(dāng)程序執(zhí)行流離開MaybeMemoryLeak()時,該對象的析構(gòu)函數(shù)會自動釋放那些資源,歧視我的理解是這樣的,對象在函數(shù)里就是一個局部變量,無論如何,函數(shù)結(jié)束該局部變量肯定要被釋放,釋放時又必然會調(diào)用該對象的析構(gòu)函數(shù)。正是利用了這一點,我們可能將資源放在對象里,這樣我們便可以來c++析構(gòu)函數(shù)自動調(diào)用機(jī)制確保資源被正確釋放。

C++標(biāo)準(zhǔn)程序庫提供的auto_ptr正是針對這種形勢而設(shè)計的,auto_ptr是一個類指針對象,也可以理解為一個棧對象,其析構(gòu)函數(shù)自動對其所指對象調(diào)用delete,注意是delete,而不是delete []

所以我們可能將上面的代碼加以修改:

#include <iostream>

#include <memory>

using namespace std;

class Widget

{

public:

      Widget()

      {

        cout<<"Widget()"<<endl;

      }

 

      ~Widget()

      {

        cout<<"~Widget()"<<endl;

      }

 

};

 

 

Widget* CreateWidget()

{

   Widget* pA = new Widget;

   return pA;

}

void MaybeMemoryLeak()

{

   auto_ptr<Widget> p(CreateWidget());

   //....

   //....

   //....

   cout<<p.get()<<endl;

}

int main()

{

    MaybeMemoryLeak();

    cout << "Hello world!" << endl;

    return 0;

}

下面是程序的執(zhí)行效果

可以看到,雖然我們沒有用delete p這樣的語句來釋放p,,但是析構(gòu)函數(shù)仍然被調(diào)用,原因就是當(dāng)對象p在函數(shù)MaybeMemoryLeak()返回時自動銷毀而對其所指對象執(zhí)行delete操作。

這里只是說明了為什么要以對象來管理資源,否則很容易出現(xiàn)MemoryLeak,具體以對象來管理資源的方法就是用到了智能指針,關(guān)于智能指針的用法和注意點這里就不多說了。比如說像auto_ptr復(fù)制時不能保值,所以在賦值操作時要特別注意。還有就是auto_ptr不能用作STL容器中的元素等等。

posted on 2013-04-29 10:44 不聽話的 閱讀(1472) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧洲一区二区天堂久久| 老司机精品视频网站| 久久精品一区二区三区四区 | 久久人体大胆视频| 欧美视频一二三区| 亚洲娇小video精品| 国产一区二区三区久久悠悠色av| 日韩一级精品视频在线观看| 亚洲人成网站999久久久综合 | 亚洲午夜在线视频| 99riav久久精品riav| 蜜乳av另类精品一区二区| 久久久久国色av免费看影院| 国产精品亚洲综合久久| 一本久久a久久免费精品不卡| 亚洲精品视频啊美女在线直播| 久久精品道一区二区三区| 欧美中文字幕在线观看| 国产精品青草久久| 亚洲视频观看| 亚洲欧美日韩综合| 欧美欧美全黄| 亚洲精品美女在线观看播放| 日韩写真视频在线观看| 欧美极品在线观看| 亚洲欧洲一二三| 亚洲精品免费一区二区三区| 牛人盗摄一区二区三区视频| 亚洲福利专区| 日韩网站在线| 欧美午夜不卡在线观看免费 | 久久久久91| 久久久久久有精品国产| 黄色成人小视频| 久久天天狠狠| 欧美激情一区| 亚洲视频一二三| 国产精品久久久久一区| 亚洲男人的天堂在线aⅴ视频| 久久精品亚洲国产奇米99| 狠狠色丁香久久婷婷综合_中| 久久综合色影院| 91久久亚洲| 亚洲尤物影院| 国产亚洲电影| 久久综合久久综合这里只有精品| 亚洲日本免费| 亚洲欧美日韩精品久久久| 国产精品视频一区二区三区| 久久久国产精品一区二区中文 | 亚洲伦理中文字幕| 欧美日韩国产区一| 亚洲女同在线| 欧美成人影音| 亚洲一区综合| 激情久久久久久久久久久久久久久久| 久久亚洲影音av资源网| 亚洲精品看片| 久久久久久久久久久久久久一区 | 亚洲国产一区二区在线| 欧美人与性动交α欧美精品济南到| 夜夜嗨av一区二区三区四季av| 久久成人精品无人区| 最近看过的日韩成人| 国产精品视频1区| 久久伊人亚洲| 亚洲视频一区二区免费在线观看| 久久中文在线| 亚洲一二三四区| 好看不卡的中文字幕| 欧美搞黄网站| 午夜精品在线| 亚洲美女性视频| 麻豆亚洲精品| 亚洲欧美中日韩| 亚洲精品国产精品乱码不99| 国产日韩av在线播放| 欧美日韩国产成人精品| 久久综合久久综合这里只有精品| 亚洲午夜视频| 日韩一级黄色大片| 欧美激情精品久久久久久蜜臀| 欧美一区二区在线免费播放| 99亚洲一区二区| 亚洲国产经典视频| 国产亚洲精品一区二区| 欧美日韩在线三级| 欧美sm视频| 毛片基地黄久久久久久天堂| 午夜精品久久久久久久久久久久| 亚洲人午夜精品免费| 欧美成人一区二区在线| 久久亚洲午夜电影| 久久激情综合| 香蕉久久国产| 午夜国产精品影院在线观看| 中文日韩在线| 亚洲美女一区| 亚洲精品国产精品国自产在线 | 久久字幕精品一区| 欧美一区二区在线播放| 亚洲在线观看免费| 亚洲一区三区视频在线观看| 一区二区三区精品久久久| 在线精品视频在线观看高清| 一区二区视频欧美| 激情另类综合| 在线免费观看成人网| 影音先锋另类| 亚洲国产高清在线观看视频| 亚洲春色另类小说| 亚洲国产欧美日韩| 亚洲国产裸拍裸体视频在线观看乱了| 极品少妇一区二区| 在线看日韩av| 亚洲黄色免费电影| 99xxxx成人网| 亚洲午夜精品一区二区| 亚洲一区二区3| 午夜亚洲福利在线老司机| 亚洲欧美中文在线视频| 久久国产精品99国产精| 免费成人高清在线视频| 欧美激情亚洲| av成人国产| 欧美亚洲一区二区在线| 久久婷婷av| 欧美日本国产精品| 国产精品久久久久久影视| 国产亚洲欧美一区二区三区| 精品成人国产在线观看男人呻吟| 亚洲国产精品123| 一区二区三区久久网| 欧美一级黄色录像| 免播放器亚洲| 夜夜夜久久久| 久久精品国产一区二区三区| 欧美黄色日本| 国产精品综合av一区二区国产馆| 黄色国产精品| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 美女日韩在线中文字幕| 亚洲激情国产| 亚洲综合清纯丝袜自拍| 老色鬼精品视频在线观看播放| 欧美日本韩国在线| 国产亚洲精品久久久| 亚洲精品一区二区在线| 欧美一区二区福利在线| 亚洲第一网站免费视频| 亚洲一区二区免费看| 美乳少妇欧美精品| 国产欧美日韩专区发布| 亚洲人成网站影音先锋播放| 欧美一级淫片播放口| 欧美激情久久久| 午夜亚洲视频| 欧美另类一区二区三区| 韩国一区二区在线观看| 亚洲欧美日韩综合aⅴ视频| 欧美大片在线看免费观看| 亚洲欧美国产毛片在线| 欧美精品三级日韩久久| 狠狠色丁香久久婷婷综合_中| 亚洲一本视频| 亚洲欧洲日韩综合二区| 久久精品国产清高在天天线| 欧美亚男人的天堂| 日韩亚洲欧美高清| 欧美高清视频免费观看| 性视频1819p久久| 欧美性片在线观看| 99精品国产福利在线观看免费| 免费成人av在线看| 香蕉久久夜色精品| 国产精品国产三级国产普通话三级 | 欧美资源在线观看| 国产美女精品在线| 亚洲一区二区精品在线观看| 亚洲电影中文字幕| 免费成人黄色片| 在线不卡亚洲| 久久免费99精品久久久久久| 亚洲综合国产| 国产精品网站在线播放| 亚洲影院在线观看| 中文精品99久久国产香蕉| 欧美日韩精品综合在线| 99视频在线精品国自产拍免费观看 | 蜜臀va亚洲va欧美va天堂| 精品成人在线| 麻豆成人在线播放| 久久精品动漫| 樱桃成人精品视频在线播放| 久久久亚洲精品一区二区三区 | 国产亚洲欧美一区| 久久精品欧洲| 久久久福利视频| 亚洲电影自拍| 欧美激情视频网站|