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

思勤無邪

上學(xué)時(shí),因我年齡最小,個(gè)頭也最小,上課時(shí),就像大猩猩堆里的猴一般。如今,這猴偶爾也把最近的一些情況寫在這里。

   :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  132 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks

公告

     吾日常三省吾身,曰思、曰勤、曰無邪。

積分與排名

  • 積分 - 187701
  • 排名 - 140

最新隨筆

最新評論

閱讀排行榜

評論排行榜

1? 引言


在程序執(zhí)行時(shí),訪問內(nèi)存是必需的,總的來說在 C ++ 語言中,內(nèi)存分配有下述二種力一式:


在靜態(tài)存儲區(qū)中分配,也稱靜態(tài)內(nèi)存分配在這種分配方式中,內(nèi)存在程序編譯時(shí)就己經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期問都存在。全局變量、 static 變量占用的內(nèi)存在靜態(tài)存儲區(qū)中,這此變量我們稱之為靜態(tài)對象。


在棧中分配,也稱局部內(nèi)存分配。函數(shù)內(nèi)的局部變量、函數(shù)的形式參數(shù)、函數(shù)執(zhí)行結(jié)束后返回的地址等都是在棧中分配內(nèi)存,函數(shù)執(zhí)行結(jié)束,這此內(nèi)存單元通過執(zhí)行出棧指令釋放。棧內(nèi)存分配和釋放指令內(nèi)置于處理器的指令集中,效率很高。在棧中分配的對象,我們稱之為局部對象。不過,局部對象的內(nèi)存分配和回收不用程序管,在程序執(zhí)行時(shí)由執(zhí)行系統(tǒng)動態(tài)進(jìn)行。


在堆中分配,也稱動態(tài)內(nèi)存分配程序在運(yùn)行的時(shí)候用操作符 new 申請長度任意的內(nèi)存,不再需要時(shí)用操作符 delete 釋放內(nèi)存。在堆中分配的對象,我們稱為動態(tài)對象。


在棧上創(chuàng)建對象既方便又理想,但更一般的情況是,在程序執(zhí)行的任何時(shí)候,需要根據(jù)來自程序外部的信息創(chuàng)建對象和銷毀對象,這就需要對內(nèi)存進(jìn)行動態(tài)分配和回收,而且這部分工作必須由程序來管,所以也是 C++ 內(nèi)存分配和回收的重點(diǎn)和難點(diǎn)。下面討論在 C ++ 程序設(shè)計(jì)中進(jìn)行內(nèi)存動態(tài)分配和回收的方法及存在的問題和解決方法。


2?? 數(shù)組對象的動態(tài)分配和回收


C ++ 程序中,數(shù)組的內(nèi)存分配有兩種,靜態(tài)分配和動態(tài)分配。在編譯時(shí)進(jìn)行的分配我們稱為靜態(tài)分配,在執(zhí)行時(shí)進(jìn)行的分配我們稱為動態(tài)分配。對于一般的程序設(shè)計(jì)者,習(xí)慣更多地使用靜態(tài)數(shù)組。然血靜態(tài)數(shù)組的長度在編譯時(shí)就確定了,有時(shí)不能滿足應(yīng)用的需要,更一般的情況是,數(shù)組的長度在程序執(zhí)行時(shí)根據(jù)輸入的數(shù)據(jù)才能確定,如求 n 個(gè)整數(shù)的最大數(shù), n 的值從鍵盤接收,此時(shí),存放 n 個(gè)整數(shù)的數(shù)組必須在執(zhí)行時(shí)用 new 操作符動態(tài)創(chuàng)建。完整的例程如下:


#include <iostream.h>


voidmain()


{cout<<"Please input a integer to n:";


cin>>n;


int *p=new int[n];


// 為長度為 n 的值確定的動態(tài)一維數(shù)組分配內(nèi)存


max=a[0];


for (int i=1;i<n;i++)


if (a[i]>a[0])a[0]=a[i];


cout<<"The max value is:"+a[0];


delete[] p;// 動態(tài)刪除數(shù)組 i. 用的主存空間


}


如果我們使用靜態(tài)數(shù)組來存放 n 個(gè)數(shù)據(jù),假定在源程序中符號常量 n 初始化為 100 ,那么程序只能處理 100 個(gè)數(shù)據(jù)以內(nèi)的整數(shù),可見程序的使用范圍小,也可以說程序執(zhí)行時(shí)的靈活性小。從上述例子中我們可以看出使用動態(tài)數(shù)組的好處,即程序能處理任意個(gè)同類型的數(shù)據(jù),只要主存空間不受限制。


在使用動態(tài)數(shù)組時(shí)必須特別注意,當(dāng)數(shù)組不再使用,應(yīng)該用 delete[] 操作符及時(shí)刪除,使得其占用過的內(nèi)存能再次利用,否則,隨著系統(tǒng)不斷動態(tài)分配內(nèi)存,可用的主存空間會越來越小,甚至?xí)谋M。


相對一維數(shù)組的動態(tài)分配形式,多維數(shù)組的動態(tài)分配形式相對復(fù)雜,且初學(xué)者使用時(shí)非常容易出錯(cuò)。下面描述了二個(gè)多維數(shù)組的動態(tài)分配形式。


char **p1=new char[3][n];


double ***p2=new double[4][m][n];


// 動態(tài)創(chuàng)建 2 維、 3 維數(shù)組 ,m,n 可以是常量或變量


在創(chuàng)建多維數(shù)組時(shí),必須十分注意指針 p1 p2 的類型,稍不注意,會將 p1 p2 聲明為 char *pl double *p2 ,導(dǎo)致編譯時(shí)產(chǎn)生和類型有關(guān)的錯(cuò)誤。另外,創(chuàng)建多維數(shù)組的第一維的大小必須由常量指定。


關(guān)于多維數(shù)組的回收和一維數(shù)組形式一致,下面的兩種形式表示刪除上述創(chuàng)建的二維和二維數(shù)組。


(1 ) delete p1 [];


(2) delete p2[];


3??? 一般對象的動態(tài)分配和回收


非數(shù)組對象 ( 一般對象 ) 的動態(tài)分配和回收相對于數(shù)組對象的創(chuàng)建和回收,要簡單此。


?????? 3.1??? 一般對象的動態(tài)分配和回收


C ++ 語言中用 new 操作符為一般對象動態(tài)分配內(nèi)存。為能夠在程序中存取 new 所創(chuàng)建的對象,必須使一個(gè)指針指向所創(chuàng)建的對象。例如,下述程序段創(chuàng)建一個(gè)初值為 (5,5) 的的屏幕上的點(diǎn)類 point 的對象,指向該對象的指針仇被賦給了指針對象 ptr


class point// 屏一 SIT 上的點(diǎn)類


{


x,y;


public:


point(int x1=0, int y1=0){x=x1 ;y=y1;}


int getx(){returnx;}


int gety(){returny;}


};


voidmain()


{point *ptr=newpoint(5,5);


// 創(chuàng)建 point 類型的對象,初始值為 (5,5)


Cout<<"x="<<pt->getx()+'\t'<<'y='<<pt->gety()+endl;


……


delete p;


常量對象的生存期也用 delete 來結(jié)束,如上面的一行語句。與創(chuàng)建的非常量對象不完全相同,創(chuàng)建的 const 對象有一些特殊的屬性。首先, const 對象必須被初始化,如果省略了括號中的初始值,就會產(chǎn)生編譯錯(cuò)誤。第二,用 new 表達(dá)式返回的值作為初始值的指針必須是一個(gè)指向 const 類型的指針。此外,我們不能創(chuàng)建元素類型為基木數(shù)據(jù)類型的 const 數(shù)組,因?yàn)?/span> const 數(shù)組不能被初始化,如象下而那樣聲明 const 數(shù)組會導(dǎo)致編譯錯(cuò)誤:


const int *pt=new const int[10];


??????? 3.3?? 定位 new 表達(dá)式


new 表達(dá)式還允許將對象創(chuàng)建在己被分配好的內(nèi)存中。這種形式的 new 表達(dá)式被稱為定位 new 表達(dá)式,其一般形式為:


new (place_ address) type


其中 place_ address 是個(gè)指針表達(dá)式, I(IJ type 是個(gè)類型表達(dá)式。必須注意,為了使用這種形式的二 w 表達(dá)式,我們必須包含頭文件 <new> 。這個(gè)功能允許程序員預(yù)分配大量的內(nèi)存供以后通過這種形式的 new 表達(dá)創(chuàng)建對象。請看下面的例子:


#include <iostream>


#include <new>


using namespace std;


const int num = 10;


class block


{


int val;


public:


int block(int a=0){val=a;}


int getval(){ return val;}


};


char 'buf=new char[sizeof(block)'num];


// 預(yù)分配內(nèi)存,但沒有 block 對象


voidmain()


{block 'p=new (buf) block;


if (p->getval() == 0)// 檢查一個(gè) block 對象是否被放在 buf


cout<<"new expression worked!"+endl;


delete[] buf;// 刪除 buf I}}J 的字符緩沖,之后不能再訪


不存在與定位 new 表達(dá)式相匹配的 delete 表達(dá)式。其實(shí)我們并不需要這樣的 delete 表達(dá)式,因?yàn)槎ㄎ?/span> new 表達(dá)式并不分配內(nèi)存。在上面的例了中,我們刪除的不是 p 指向的內(nèi)存,而是 buf 指向的內(nèi)存。當(dāng)程序不再需要字符緩沖時(shí), buf 指向的內(nèi)存被刪除,此時(shí)字符緩沖中的任何對象的生命期都結(jié)束了,在上面的例了中, p 就不再指向一個(gè)有效的 block 類的對象了。


4 使用動態(tài)內(nèi)存常見的問題與對策


C 語言提供的動態(tài)內(nèi)存分配和回收方法相比, new delete C 語言的 malloc() free() 函數(shù)使用起來更加方便和安全,但同時(shí)也增加了各種錯(cuò)誤發(fā)生的機(jī)會,我們總結(jié)了如下幾個(gè)方面的錯(cuò)誤。


?????? 4.l? 未使用相同形式的 new delete


首先我們來看下面的語句序列 :


int *pt=new int[30];


……


delete pt;


這兩條語句看似沒有問題,而且編譯器也不會給出錯(cuò)誤或警告信息,其實(shí)己經(jīng)發(fā)生了內(nèi)存泄漏。因?yàn)?/span> 30 個(gè)整型對象有 29 個(gè)都未被釋放內(nèi)存空問,上述代碼表示釋放了數(shù)組的第一個(gè)元素對象。為什么會這樣呢,因?yàn)樵谑褂?/span> delete 表達(dá)式時(shí),編譯器不知道即將被刪除的指針指向的是單一對象或數(shù)組對象,它只會根據(jù) delete 的使用形式來判斷,帶了下標(biāo)符“ [] ”的則認(rèn)為是刪除數(shù)組對象,否則就認(rèn)為是刪除單一對象。因此,解決該問題的方法很簡單,當(dāng)使用 new 時(shí)帶了下標(biāo)符“ [] ”,使用 delete 時(shí)也應(yīng)帶 [] ;當(dāng)你使用 new 時(shí)未帶“ [] ”,使用 delete 時(shí)也不應(yīng)帶“ [] ”。


??????? 4.2? 內(nèi)存不足的問題


如果 new 操作找不到足夠大的內(nèi)存塊,則引發(fā) bad_alloc 標(biāo)準(zhǔn)類型的異常,為了提高程序的可靠性,程序中必須能捕獲這種內(nèi)存分配失敗引發(fā)的異常,這是一般程序員容易忽視的問題。不過因?yàn)楫惓L幚韴?zhí)行效率不高,所以可用下述方法使 new 操作返回一個(gè) NULL 而不拋出一個(gè)異常。例如程序段:


B*p=new (nothrow) B;/* 對象 nothrow 是在 new 中定義的常量,


指出如果 new 操作失敗則返回 NULL 而不產(chǎn)生異常 */


if (!p){cout<<"allocation failure"<<endl;return;}


4.3? 內(nèi)存被釋放后使用指針的問題


指向并不存在的內(nèi)存的指針,我們稱之為“野指針”。例如程序段 :


char *p=new char[6];


strcpy(p,"hello");


delete[] p;// 此時(shí) p 成了野指針


……


if (p) strcpy(p,"world");// 執(zhí)行時(shí)出錯(cuò)


……


為了能有效解決上述問題,一個(gè)簡單的辦法就是在內(nèi)存釋放后,將指針賦值為 VULI 。如 :


delete[] p;


p=N ULL;


4.4 沒有和構(gòu)造函數(shù)配對的析構(gòu)函數(shù)


如果在一個(gè)類對象在創(chuàng)建時(shí)要動態(tài)分配內(nèi)存,就會在構(gòu)造


函數(shù)中用 new 分配。例如 :


class array


{int *p;


public:


array(int i){p=new int[i];}...


};


很明顯,在構(gòu)造函數(shù)中為 array 類對象分配的內(nèi)存一直不能被釋放,隨著對象的多次產(chǎn)生,就會產(chǎn)生嚴(yán)重的內(nèi)存泄漏問題。解決辦法是為這種類增加這樣一個(gè)析構(gòu)函數(shù) :array ::array{delete [] p;}


5 ? 結(jié)束語


C ++ 程序設(shè)計(jì)中,會經(jīng)常進(jìn)行內(nèi)存的動態(tài)分配和回收。木文對 C++ 的動態(tài)內(nèi)存技術(shù)進(jìn)行了討論,并對常見問題提出了可行的解決方法。其實(shí),用好 new delete 是一門技術(shù),它能減少程序中與使用指針有關(guān)的運(yùn)行錯(cuò)誤,從而減輕調(diào)試程序的難度,另外它還能提高程序的可靠性(健壯性)。

posted on 2006-05-31 17:48 思勤無邪 閱讀(648) 評論(0)  編輯 收藏 引用 所屬分類: C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产va精品久久久不卡综合| 国产在线欧美日韩| 欧美日韩另类丝袜其他| 欧美成人资源网| 欧美激情一区二区三区不卡| 嫩草国产精品入口| 欧美国产日产韩国视频| 欧美日韩视频不卡| 国产精品美女在线观看| 国产亚洲欧洲| 亚洲高清在线| 一区二区高清视频| 午夜欧美大片免费观看 | 欧美黄色aaaa| 亚洲精品1234| 亚洲作爱视频| 欧美一区二区成人| 久久久久久夜精品精品免费| 欧美成人亚洲成人| 欧美午夜大胆人体| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲免费在线看| 久久精品国产99国产精品澳门| 六月丁香综合| 欧美日韩麻豆| 国产亚洲欧美另类中文| 亚洲国产成人一区| 亚洲视频在线看| 久久久青草婷婷精品综合日韩 | 亚洲一区二区三区在线| 久久精品国产99| 亚洲第一区在线观看| 一本高清dvd不卡在线观看| 欧美在线二区| 欧美精品在线播放| 国产视频不卡| 日韩西西人体444www| 小嫩嫩精品导航| 欧美gay视频| 亚洲婷婷综合色高清在线| 久久久噜噜噜久久中文字免| 欧美日韩午夜视频在线观看| 国产亚洲欧美色| 99热这里只有成人精品国产| 久久精品国产一区二区三| 亚洲福利电影| 欧美在线播放| 欧美四级在线| 亚洲黄色性网站| 欧美亚洲免费| 日韩小视频在线观看专区| 久久精品在线| 国产精品美女久久久免费| 亚洲激情专区| 久久亚洲国产成人| 亚洲午夜精品| 欧美激情一区二区三区在线| 黄色国产精品| 性感少妇一区| 9国产精品视频| 欧美成在线视频| 在线观看成人网| 久久福利资源站| 中文一区在线| 欧美精品久久天天躁| 亚洲电影成人| 久久久999精品免费| 亚洲视频999| 欧美日韩另类综合| 亚洲日本激情| 欧美国产日韩在线观看| 欧美在线视频免费观看| 国产精品一卡| 午夜一区二区三视频在线观看| 亚洲伦理在线免费看| 美日韩精品免费观看视频| 黄色成人免费观看| 久久久精品2019中文字幕神马| 亚洲视频精选| 欧美日韩国产在线看| 亚洲欧洲一区二区三区在线观看| 久久婷婷麻豆| 欧美永久精品| 国产小视频国产精品| 欧美一区二区三区在线| 亚洲性感激情| 国产精品久久久久久久午夜片| 中国成人亚色综合网站| 日韩网站在线| 欧美日韩免费看| 一区二区日韩伦理片| 亚洲欧洲一二三| 欧美—级在线免费片| 日韩午夜黄色| 亚洲精选视频免费看| 欧美日韩国产bt| 一本色道久久综合精品竹菊| 亚洲精品一区二区三区蜜桃久| 欧美激情中文字幕乱码免费| 亚洲毛片在线观看.| 亚洲毛片av在线| 欧美日韩精品二区| 亚洲少妇中出一区| 在线综合+亚洲+欧美中文字幕| 国产精品video| 欧美一级视频精品观看| 亚欧成人精品| 亚洲国产高清在线| 亚洲福利精品| 欧美日韩一区二区三区在线观看免| 这里只有精品视频在线| 中文欧美日韩| 国外成人在线视频网站| 免费视频久久| 欧美精品午夜| 午夜激情亚洲| 久久精品国产第一区二区三区最新章节| 激情视频一区| 亚洲片区在线| 国产精品久久毛片a| 久久国产福利国产秒拍| 久久久久久久激情视频| 最新亚洲一区| 中国成人在线视频| 国一区二区在线观看| 欧美激情四色 | 亚洲精品视频在线播放| 国产精品美女一区二区| 久久综合中文字幕| 欧美精品午夜| 欧美一进一出视频| 久久综合色天天久久综合图片| 亚洲美女在线视频| 亚洲一区二区在线播放| 影院欧美亚洲| 在线综合亚洲| 在线欧美电影| 亚洲一区二区黄色| 亚洲电影在线观看| 一区二区日本视频| 极品尤物av久久免费看| 亚洲精品久久久久久久久久久久 | 亚洲主播在线观看| 亚洲激情在线播放| 亚洲男女毛片无遮挡| 亚洲成人在线| 一本色道久久精品| 亚洲国产黄色片| 亚洲天堂成人| 亚洲精品少妇| 欧美在线地址| 亚洲新中文字幕| 老**午夜毛片一区二区三区| 亚洲欧美日韩精品久久| 另类成人小视频在线| 午夜亚洲激情| 欧美精品日韩三级| 美日韩丰满少妇在线观看| 欧美午夜在线视频| 亚洲高清免费视频| 国产一区二区三区在线播放免费观看 | 性感少妇一区| 欧美日韩国产高清| 欧美va日韩va| 国产亚洲精品一区二区| 中文国产成人精品| 日韩午夜在线视频| 可以免费看不卡的av网站| 欧美在线视频不卡| 国产精品v日韩精品v欧美精品网站| 欧美成人午夜影院| 国产在线视频欧美| 亚洲一区影音先锋| 一区二区三区四区国产精品| 麻豆精品一区二区综合av| 久久久久综合| 国产欧美日韩三区| 亚洲视频一二区| 亚洲视频一二区| 欧美美女bb生活片| 91久久精品日日躁夜夜躁欧美| 黄色欧美日韩| 欧美中文在线观看| 欧美在线你懂的| 国产精品一区二区三区四区五区| 一个人看的www久久| 亚洲精品影院在线观看| 美女福利精品视频| 欧美成人精品高清在线播放| 狠狠久久综合婷婷不卡| 性欧美video另类hd性玩具| 香港久久久电影| 国产精品自拍在线| 亚洲欧美日韩国产一区| 欧美一级久久| 国产亚洲精品久久久久久| 午夜精品久久久| 久久久99国产精品免费| 国语自产精品视频在线看一大j8| 午夜精品成人在线视频|