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

單鏈DNA

換了個(gè)地址:http://www.cnblogs.com/vizhen/

 

淺析C++中內(nèi)存分配方式

  在C++中,內(nèi)存分為5大存儲(chǔ)區(qū)堆區(qū)、棧區(qū)、全局區(qū)、文字常量區(qū)、程序代碼區(qū)。

 

內(nèi)存區(qū)域 說(shuō)明
棧區(qū)(stack)    由編譯器自動(dòng)分配釋放,存放為運(yùn)行函數(shù)而分配的局部變量、函數(shù)參數(shù)、返回?cái)?shù)據(jù)、返回地址等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
堆區(qū)(heap)   一般有程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能有系統(tǒng)回收。分配方式類似于鏈表。
全局區(qū)(static) 存放全局變量、靜態(tài)數(shù)據(jù)、常量。程序結(jié)束后有系統(tǒng)釋放。
文字常量區(qū)   常量字符串就是放在這里;程序結(jié)束后有系統(tǒng)釋放。
程序代碼區(qū)   存放函數(shù)體(類成員函數(shù)和全局函數(shù))的二進(jìn)制代碼。

實(shí)例分析:

int a=0; //全局區(qū)初始化區(qū) char *p1;    //全局區(qū)未初始化區(qū) static char b;      //全局區(qū)未初始化靜態(tài)變量 int main() { int c; //棧區(qū)臨時(shí)變量 char s[]="abc"; //棧區(qū)臨時(shí)數(shù)組變量 char *p2; //棧區(qū)臨時(shí)指針變量 char *p3="123";    //常量區(qū)常量,棧區(qū)指針變量 static int d=0; //全局初始化區(qū)靜態(tài)變量 p1=new char[10]; //堆區(qū)分配10個(gè)字符空間 p2=new char[20]; //堆區(qū)分配20個(gè)字符空間 strcpy(p1,"123"); //"123"放在常量區(qū),編譯器有可能將它與p3所指向的區(qū)域相同

}

內(nèi)存分配方式

  • 從靜態(tài)存儲(chǔ)區(qū)分配

    內(nèi)存在程序編譯時(shí)就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。速度快、不容易出錯(cuò),因?yàn)橄到y(tǒng)會(huì)善后。例如全局變量,static常量。
  • 從棧上分配

    在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)部局部變量的存儲(chǔ)單元都在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器指令集中,效率很高,但分配的內(nèi)存容量有限。
  • 從堆上分配

    也叫動(dòng)態(tài)分配。程序在運(yùn)行時(shí)用malloc或new申請(qǐng)任意大小的內(nèi)存,程序員自己負(fù)責(zé)在何時(shí)用free或delete釋放內(nèi)存。動(dòng)態(tài)內(nèi)存的生存期有程序員決定,使用靈活。如果在堆上分配了空間,就有責(zé)任回收它,否則運(yùn)行的程序會(huì)出現(xiàn)內(nèi)存泄露,另外頻繁的分配和釋放不同大小的堆空間將會(huì)產(chǎn)生對(duì)內(nèi)碎塊。

     

    堆和棧究區(qū)別

    主要的區(qū)別由以下幾點(diǎn):
       1.管理方式:對(duì)于棧來(lái)講,是由編譯器自動(dòng)管理,無(wú)需我們手工控制;對(duì)于堆來(lái)說(shuō),釋放工作由程序員控制,容易產(chǎn)生memory leak。

       2.空間大?。阂话銇?lái)講在32位系統(tǒng)下,堆內(nèi)存可以達(dá)到4G的空間,從這個(gè)角度來(lái)看堆內(nèi)存幾乎是沒(méi)有什么限制的。但是對(duì)于棧來(lái)講,一般都是有一定的空間大小 的,例如,在VC6下面,默認(rèn)的??臻g大小是1M(好像是,記不清楚了)。當(dāng)然,我們可以修改:
    打開(kāi)工程,依次操作菜單如下:Project->Setting->Link,在Category 中選中Output,然后在Reserve中設(shè)定堆棧的最大值和commit。
        注意:reserve最小值為4Byte;commit是保留在虛擬內(nèi)存的頁(yè)文件里面,它設(shè)置的較大會(huì)使棧開(kāi)辟較大的值,可能增加內(nèi)存的開(kāi)銷和啟動(dòng)時(shí)間。
      

       3.碎片問(wèn)題:對(duì)于堆來(lái)講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對(duì)于棧來(lái)講,則不會(huì)存在這個(gè)問(wèn)題, 因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對(duì)應(yīng),以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出,在他彈出之前,在他上面的后進(jìn)的棧內(nèi)容已經(jīng)被彈出,詳細(xì)的 可以參考數(shù)據(jù)結(jié)構(gòu),這里我們就不再一一討論了。
     

       4.生長(zhǎng)方向:對(duì)于堆來(lái)講,生長(zhǎng)方向是向上的,也就是向著內(nèi)存地址增加的方向;對(duì)于棧來(lái)講,它的生長(zhǎng)方向是向下的,是向著內(nèi)存地址減小的方向增長(zhǎng)。
    分配方式:堆都是動(dòng)態(tài)分配的,沒(méi)有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動(dòng)態(tài)分配由 alloca函數(shù)進(jìn)行分配,但是棧的動(dòng)態(tài)分配和堆是不同的,他的動(dòng)態(tài)分配是由編譯器進(jìn)行釋放,無(wú)需我們手工實(shí)現(xiàn)。

        5.分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比 較高。堆則是C/C++函數(shù)庫(kù)提供的,它的機(jī)制是很復(fù)雜的,例如為了分配一塊內(nèi)存,庫(kù)函數(shù)會(huì)按照一定的算法(具體的算法可以參考數(shù)據(jù)結(jié)構(gòu)/操作系統(tǒng))在堆內(nèi)存中搜索可用的足夠大小的空間,如果沒(méi)有足夠大小的空間(可能是由于內(nèi)存碎片太多),就有可能調(diào)用系統(tǒng)功能去增加程序數(shù)據(jù)段的內(nèi)存空間,這樣就有機(jī)會(huì)分 到足夠大小的內(nèi)存,然后進(jìn)行返回。顯然,堆的效率比棧要低得多。

    常見(jiàn)的內(nèi)存錯(cuò)誤及其對(duì)策:

    發(fā)生內(nèi)存錯(cuò)誤是件非常麻煩的事情。編譯器不能自動(dòng)發(fā)現(xiàn)這些錯(cuò)誤,通常是在程序運(yùn)行時(shí)才能捕捉到。而這些錯(cuò)誤大多沒(méi)有明顯的癥狀,時(shí)隱時(shí)現(xiàn),增加了改錯(cuò)的難度。常見(jiàn)的內(nèi)存錯(cuò)誤及其對(duì)策如下:

      * 內(nèi)存分配未成功,卻使用了它。

      編程新手常犯這種錯(cuò)誤,因?yàn)樗麄儧](méi)有意識(shí)到內(nèi)存分配會(huì)不成功。常用解決辦法是,在使用內(nèi)存之前檢查指針是否為NULL。如果指針p是函數(shù)的參數(shù),那么在函數(shù)的入口處用assert(p!=NULL)進(jìn)行檢查。如果是用malloc或new來(lái)申請(qǐng)內(nèi)存,應(yīng)該用if(p==NULL) 或if(p!=NULL)進(jìn)行防錯(cuò)處理。

         * 內(nèi)存分配雖然成功,但是尚未初始化就引用它。

      犯這種錯(cuò)誤主要有兩個(gè)起因:一是沒(méi)有初始化的觀念;二是誤以為內(nèi)存的缺省初值全為零,導(dǎo)致引用初值錯(cuò)誤(例如數(shù)組)。 內(nèi)存的缺省初值究竟是什么并沒(méi)有統(tǒng)一的標(biāo)準(zhǔn),盡管有些時(shí)候?yàn)榱阒?,我們寧可信其無(wú)不可信其有。所以無(wú)論用何種方式創(chuàng)建數(shù)組,都別忘了賦初值,即便是賦零值也不可省略,不要嫌麻煩。

      * 內(nèi)存分配成功并且已經(jīng)初始化,但操作越過(guò)了內(nèi)存的邊界。

      例如在使用數(shù)組時(shí)經(jīng)常發(fā)生下標(biāo)“多1”或者“少1”的操作。特別是在for循環(huán)語(yǔ)句中,循環(huán)次數(shù)很容易搞錯(cuò),導(dǎo)致數(shù)組操作越界。

      * 忘記了釋放內(nèi)存,造成內(nèi)存泄露。

      含有這種錯(cuò)誤的函數(shù)每被調(diào)用一次就丟失一塊內(nèi)存。剛開(kāi)始時(shí)系統(tǒng)的內(nèi)存充足,你看不到錯(cuò)誤。終有一次程序突然死掉,系統(tǒng)出現(xiàn)提示:內(nèi)存耗盡。

      動(dòng)態(tài)內(nèi)存的申請(qǐng)與釋放必須配對(duì),程序中malloc與free的使用次數(shù)一定要相同,否則肯定有錯(cuò)誤(new/delete同理)。

      * 釋放了內(nèi)存卻繼續(xù)使用它。

      有三種情況:

     ?。?)程序中的對(duì)象調(diào)用關(guān)系過(guò)于復(fù)雜,實(shí)在難以搞清楚某個(gè)對(duì)象究竟是否已經(jīng)釋放了內(nèi)存,此時(shí)應(yīng)該重新設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu),從根本上解決對(duì)象管理的混亂局面。

     ?。?)函數(shù)的return語(yǔ)句寫錯(cuò)了,注意不要返回指向“棧內(nèi)存”的“指針”或者“引用”,因?yàn)樵搩?nèi)存在函數(shù)體結(jié)束時(shí)被自動(dòng)銷毀。

      (3)使用free或delete釋放了內(nèi)存后,沒(méi)有將指針設(shè)置為NULL。導(dǎo)致產(chǎn)生“野指針”。

        【規(guī)則1】用malloc或new申請(qǐng)內(nèi)存之后,應(yīng)該立即檢查指針值是否為NULL。防止使用指針值為NULL的內(nèi)存。

          【規(guī)則2】不要忘記為數(shù)組和動(dòng)態(tài)內(nèi)存賦初值。防止將未被初始化的內(nèi)存作為右值使用。

       【規(guī)則3】避免數(shù)組或指針的下標(biāo)越界,特別要當(dāng)心發(fā)生“多1”或者“少1”操作。

        【規(guī)則4】動(dòng)態(tài)內(nèi)存的申請(qǐng)與釋放必須配對(duì),防止內(nèi)存泄漏。

      【規(guī)則5】用free或delete釋放了內(nèi)存之后,立即將指針設(shè)置為NULL,防止產(chǎn)生“野指針”。

  • posted on 2011-02-11 00:22 Geek.tan 閱讀(499) 評(píng)論(0)  編輯 收藏 引用

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    coding是我的寂寞,我是誰(shuí)的寂寞

    隨筆分類(40)

    隨筆檔案(48)

    搜索

    積分與排名

    最新評(píng)論

    評(píng)論排行榜

    青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一本一本久久a久久精品综合妖精| 亚洲欧美日韩在线播放| 亚洲二区三区四区| 黑人中文字幕一区二区三区| 国产亚洲精品久久久久久| 国产人久久人人人人爽| 国产精品午夜国产小视频| 国产精品www994| 国产日本亚洲高清| 在线成人激情黄色| 艳妇臀荡乳欲伦亚洲一区| 中文在线资源观看网站视频免费不卡 | 亚洲欧洲精品一区二区三区不卡 | 免费在线观看一区二区| 久久天堂精品| 亚洲国产美女精品久久久久∴| 日韩午夜一区| 久久se精品一区精品二区| 免费观看成人网| 欧美日韩在线精品| 好吊色欧美一区二区三区四区| 亚洲精品乱码久久久久久| 亚洲欧美久久久| 免费在线亚洲| 亚洲专区国产精品| 久久综合久久久久88| 国产精品v欧美精品v日韩 | 亚洲精品午夜精品| 欧美在线免费看| 亚洲欧洲精品一区二区精品久久久| 亚洲伊人色欲综合网| 蜜臀av国产精品久久久久| 国产精品影音先锋| 一区二区三区高清在线| 免费在线日韩av| 午夜国产不卡在线观看视频| 欧美激情视频给我| 尤物yw午夜国产精品视频| 午夜日韩在线| 99热免费精品在线观看| 免费在线看一区| 一区二区三区在线高清| 欧美亚洲一区二区在线观看| 亚洲理论在线观看| 欧美国产一区视频在线观看| 伊人久久成人| 久久先锋影音| 午夜日韩电影| 国产精品视区| 亚洲欧美日韩中文视频| 日韩午夜在线播放| 欧美日韩高清在线| 亚洲美女黄色| 亚洲国产天堂久久综合| 猫咪成人在线观看| 亚洲国产精品成人精品| 久久婷婷色综合| 久久精品国产96久久久香蕉| 国产日韩在线看| 久久av二区| 欧美一区二区播放| 国产亚洲精品自拍| 久久―日本道色综合久久| 亚洲福利av| 欧美成人一区在线| 欧美大香线蕉线伊人久久国产精品| 久久天堂国产精品| 一区二区成人精品| 亚洲高清色综合| 久久久一本精品99久久精品66| 国产精品一区二区三区四区| 亚洲欧美一区在线| 亚洲午夜在线视频| 国产片一区二区| 久久综合伊人77777蜜臀| 久久久久欧美精品| 亚洲国产精品热久久| 亚洲黄网站在线观看| 欧美日韩免费观看一区=区三区| 亚洲午夜日本在线观看| 一区二区三区|亚洲午夜| 国产日产欧美精品| 欧美成人免费小视频| 欧美久久久久久久| 性欧美1819sex性高清| 久久精品人人做人人综合| 91久久久久久久久久久久久| 99视频精品全国免费| 国产亚洲人成网站在线观看| 欧美电影免费观看网站| 欧美三日本三级三级在线播放| 欧美自拍丝袜亚洲| 欧美成人蜜桃| 欧美在线综合| 欧美精品18+| 久久本道综合色狠狠五月| 欧美成人资源网| 久久久777| 欧美日韩国产123区| 久久亚洲综合| 国产精品久久久久一区| 欧美国产日韩a欧美在线观看| 国产精品久久久对白| 免费观看欧美在线视频的网站| 欧美日韩国产高清| 另类av导航| 国产欧美在线视频| 99re6热在线精品视频播放速度| 国模吧视频一区| 亚洲无线视频| 99re6这里只有精品| 久久欧美肥婆一二区| 欧美一区二区三区另类| 欧美日韩亚洲国产精品| 亚洲成人直播| 伊人久久大香线蕉av超碰演员| 亚洲一区二区三区精品视频| 日韩一级在线| 欧美福利视频在线| 欧美激情一区二区三区蜜桃视频 | 久久精品伊人| 欧美天堂亚洲电影院在线观看 | 99在线精品免费视频九九视| 久久久久九九视频| 久久久国产亚洲精品| 国产精品久久久免费| 日韩午夜av在线| 99亚洲视频| 欧美激情视频在线免费观看 欧美视频免费一 | 国产精品高清在线| 久久精品国产96久久久香蕉| 欧美日韩一区二区视频在线| 亚洲黄色精品| 最新亚洲视频| 欧美成人精品1314www| 欧美成人综合| 亚洲欧洲精品一区二区三区不卡| 久久久天天操| 欧美激情视频一区二区三区在线播放 | 午夜视频久久久| 先锋影院在线亚洲| 国产精品日日摸夜夜摸av| 亚洲小视频在线观看| 亚洲私人影吧| 国产精品欧美激情| 香蕉尹人综合在线观看| 久久久91精品国产| 在线免费高清一区二区三区| 久久精品一二三| 欧美电影打屁股sp| 99在线|亚洲一区二区| 国产精品福利网站| 欧美中文字幕不卡| 欧美大片在线观看一区| 亚洲美女免费视频| 国产精品久久久久久影院8一贰佰| 亚洲欧美日韩在线综合| 久久综合图片| 日韩视频在线观看国产| 国产精品初高中精品久久| 欧美在线网址| 亚洲激情亚洲| 欧美一区激情视频在线观看| 永久555www成人免费| 欧美日产一区二区三区在线观看| 亚洲最新视频在线播放| 久久久精品国产免费观看同学| 亚洲国产精品一区制服丝袜| 欧美日韩国产丝袜另类| 欧美一区永久视频免费观看| 欧美成人精品一区| 亚洲一区二三| 亚洲高清在线| 国产精品久久国产愉拍| 老司机免费视频一区二区| 99视频精品在线| 欧美成人精品一区二区| 欧美一区二区黄色| 亚洲精品孕妇| 国产伦精品一区二区三区免费迷| 久久蜜桃精品| 亚洲午夜精品久久久久久app| 久久在线精品| 一区二区三区精密机械公司 | 亚洲免费在线视频| 欧美大片在线看免费观看| 亚洲欧美第一页| 亚洲日产国产精品| 国产一区二区三区四区在线观看| 欧美激情在线观看| 久久免费国产精品| 亚洲欧美在线观看| 一级日韩一区在线观看| 欧美激情一区二区三区在线视频| 欧美一区二区三区另类| 一区二区三区视频在线看| 亚洲国产另类久久久精品极度| 国产日韩欧美三级| 国产精品v欧美精品∨日韩| 欧美精品一区二区三区久久久竹菊|