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

思勤無邪

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

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  132 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks

公告

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

積分與排名

  • 積分 - 187701
  • 排名 - 140

最新隨筆

最新評論

閱讀排行榜

評論排行榜

1? 引言


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


在靜態存儲區中分配,也稱靜態內存分配在這種分配方式中,內存在程序編譯時就己經分配好,這塊內存在程序的整個運行期問都存在。全局變量、 static 變量占用的內存在靜態存儲區中,這此變量我們稱之為靜態對象。


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


在堆中分配,也稱動態內存分配程序在運行的時候用操作符 new 申請長度任意的內存,不再需要時用操作符 delete 釋放內存。在堆中分配的對象,我們稱為動態對象。


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


2?? 數組對象的動態分配和回收


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


#include <iostream.h>


voidmain()


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


cin>>n;


int *p=new int[n];


// 為長度為 n 的值確定的動態一維數組分配內存


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;// 動態刪除數組 i. 用的主存空間


}


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


在使用動態數組時必須特別注意,當數組不再使用,應該用 delete[] 操作符及時刪除,使得其占用過的內存能再次利用,否則,隨著系統不斷動態分配內存,可用的主存空間會越來越小,甚至會耗盡。


相對一維數組的動態分配形式,多維數組的動態分配形式相對復雜,且初學者使用時非常容易出錯。下面描述了二個多維數組的動態分配形式。


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


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


// 動態創建 2 維、 3 維數組 ,m,n 可以是常量或變量


在創建多維數組時,必須十分注意指針 p1 p2 的類型,稍不注意,會將 p1 p2 聲明為 char *pl double *p2 ,導致編譯時產生和類型有關的錯誤。另外,創建多維數組的第一維的大小必須由常量指定。


關于多維數組的回收和一維數組形式一致,下面的兩種形式表示刪除上述創建的二維和二維數組。


(1 ) delete p1 [];


(2) delete p2[];


3??? 一般對象的動態分配和回收


非數組對象 ( 一般對象 ) 的動態分配和回收相對于數組對象的創建和回收,要簡單此。


?????? 3.1??? 一般對象的動態分配和回收


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


class point// 屏一 SIT 上的點類


{


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);


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


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


……


delete p;


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


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


??????? 3.3?? 定位 new 表達式


new 表達式還允許將對象創建在己被分配好的內存中。這種形式的 new 表達式被稱為定位 new 表達式,其一般形式為:


new (place_ address) type


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


#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];


// 預分配內存,但沒有 block 對象


voidmain()


{block 'p=new (buf) block;


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


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


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


不存在與定位 new 表達式相匹配的 delete 表達式。其實我們并不需要這樣的 delete 表達式,因為定位 new 表達式并不分配內存。在上面的例了中,我們刪除的不是 p 指向的內存,而是 buf 指向的內存。當程序不再需要字符緩沖時, buf 指向的內存被刪除,此時字符緩沖中的任何對象的生命期都結束了,在上面的例了中, p 就不再指向一個有效的 block 類的對象了。


4 使用動態內存常見的問題與對策


C 語言提供的動態內存分配和回收方法相比, new delete C 語言的 malloc() free() 函數使用起來更加方便和安全,但同時也增加了各種錯誤發生的機會,我們總結了如下幾個方面的錯誤。


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


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


int *pt=new int[30];


……


delete pt;


這兩條語句看似沒有問題,而且編譯器也不會給出錯誤或警告信息,其實己經發生了內存泄漏。因為 30 個整型對象有 29 個都未被釋放內存空問,上述代碼表示釋放了數組的第一個元素對象。為什么會這樣呢,因為在使用 delete 表達式時,編譯器不知道即將被刪除的指針指向的是單一對象或數組對象,它只會根據 delete 的使用形式來判斷,帶了下標符“ [] ”的則認為是刪除數組對象,否則就認為是刪除單一對象。因此,解決該問題的方法很簡單,當使用 new 時帶了下標符“ [] ”,使用 delete 時也應帶 [] ;當你使用 new 時未帶“ [] ”,使用 delete 時也不應帶“ [] ”。


??????? 4.2? 內存不足的問題


如果 new 操作找不到足夠大的內存塊,則引發 bad_alloc 標準類型的異常,為了提高程序的可靠性,程序中必須能捕獲這種內存分配失敗引發的異常,這是一般程序員容易忽視的問題。不過因為異常處理執行效率不高,所以可用下述方法使 new 操作返回一個 NULL 而不拋出一個異常。例如程序段:


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


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


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


4.3? 內存被釋放后使用指針的問題


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


char *p=new char[6];


strcpy(p,"hello");


delete[] p;// 此時 p 成了野指針


……


if (p) strcpy(p,"world");// 執行時出錯


……


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


delete[] p;


p=N ULL;


4.4 沒有和構造函數配對的析構函數


如果在一個類對象在創建時要動態分配內存,就會在構造


函數中用 new 分配。例如 :


class array


{int *p;


public:


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


};


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


5 ? 結束語


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

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>
            亚洲欧美综合网| 韩国三级电影一区二区| 欧美一区二区三区四区夜夜大片| 欧美不卡激情三级在线观看| 午夜精品国产| 日韩一区二区精品葵司在线| 国产丝袜一区二区| 欧美日韩日日骚| 欧美xart系列高清| 久久久久国产精品www| 午夜激情综合网| 一区二区三区四区精品| 欧美国产先锋| 美日韩精品免费观看视频| 欧美在线视频不卡| 亚洲一级黄色| 一本色道久久综合狠狠躁篇怎么玩| 在线欧美小视频| 国内精品久久久久国产盗摄免费观看完整版 | 欧美大片免费观看| 久久动漫亚洲| 亚洲欧美久久| 亚洲欧美在线磁力| 一本久久综合亚洲鲁鲁| 亚洲人屁股眼子交8| 亚洲成人在线视频网站| 韩国三级电影一区二区| 黑丝一区二区三区| 国产综合网站| 黄色综合网站| 影音先锋亚洲精品| 亚洲成色www8888| 激情亚洲网站| 亚洲第一精品夜夜躁人人躁| 在线不卡a资源高清| 亚洲电影免费在线| 欧美成人精品三级在线观看| 久久www成人_看片免费不卡| 欧美在线亚洲一区| 久久国产精品久久久| 久久久久久电影| 久久免费精品视频| 欧美1区2区| 欧美日本网站| 欧美午夜精品久久久久久人妖| 国产精品久久久久久久久久免费 | 国内精品久久久久久影视8| 国产农村妇女毛片精品久久莱园子| 国产精品久久久久毛片软件| 国产亚洲精品自拍| 今天的高清视频免费播放成人 | 久久成人人人人精品欧| 久久久久欧美| 欧美激情亚洲激情| 99精品福利视频| 亚洲一区二区三区三| 亚洲欧美日韩精品久久久| 欧美一区二区视频网站| 美女福利精品视频| 欧美日韩亚洲一区二| 国产精品视频网站| 激情小说另类小说亚洲欧美| 亚洲人成毛片在线播放| 亚洲午夜未删减在线观看| 欧美资源在线| 欧美高清在线视频观看不卡| 日韩一级不卡| 久久成人精品一区二区三区| 欧美成人免费在线| 国产精品久久一卡二卡| 在线精品视频免费观看| 亚洲视频一二三| 久久久久国产精品一区三寸| 亚洲电影免费在线观看| 中文一区二区在线观看| 久久全球大尺度高清视频| 欧美日韩视频| 红桃av永久久久| 在线综合亚洲| 欧美成年人在线观看| 亚洲午夜电影网| 欧美a级片网站| 国产欧美日韩伦理| 91久久一区二区| 欧美伊人久久久久久久久影院| 欧美成人免费大片| 小黄鸭视频精品导航| 欧美激情在线免费观看| 国产一区二区三区高清| 亚洲性图久久| 欧美国产高清| 欧美在线看片a免费观看| 欧美日韩国内| 亚洲缚视频在线观看| 欧美一区二区三区在线看| 亚洲国产精品悠悠久久琪琪| 欧美与欧洲交xxxx免费观看 | 久久精品国产精品亚洲综合| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲国产mv| 久久精品国产亚洲一区二区三区| 亚洲美女在线国产| 六十路精品视频| 激情六月婷婷久久| 久久国产毛片| 亚洲午夜精品网| 欧美日韩一区在线观看| 亚洲人精品午夜| 在线中文字幕不卡| 国产精品久久午夜| 国内精品久久久| 午夜精品久久久99热福利| 亚洲电影中文字幕| 久久免费偷拍视频| 国产亚洲女人久久久久毛片| 亚洲欧美文学| 一本一道久久综合狠狠老精东影业| 免费欧美电影| 亚洲国产精品v| 久久嫩草精品久久久精品| 亚洲在线一区二区| 欧美性事免费在线观看| 这里只有精品视频| 亚洲人体影院| 欧美另类在线播放| 日韩网站在线| 亚洲精品日韩久久| 欧美日韩亚洲系列| 宅男精品导航| 中文亚洲欧美| 国产精品专区一| 欧美中文字幕| 久久99伊人| 国内偷自视频区视频综合| 久久精品中文字幕一区| 欧美伊人久久大香线蕉综合69| 国产日韩精品综合网站| 久久久久国产一区二区三区| 欧美中文字幕久久| 尤物99国产成人精品视频| 欧美不卡在线视频| 欧美精品观看| 亚洲一级黄色| 午夜精品久久久| 国内精品视频666| 欧美激情1区2区3区| 欧美波霸影院| 亚洲伊人观看| 午夜视频一区| 伊人狠狠色丁香综合尤物| 欧美国产日韩亚洲一区| 欧美日韩成人综合在线一区二区 | 久久久久国产一区二区| 久久午夜视频| aa亚洲婷婷| 午夜视频精品| 最新成人av在线| 99视频在线精品国自产拍免费观看| 国产精品欧美一区二区三区奶水| 欧美一区二区三区喷汁尤物| 久久九九精品99国产精品| 亚洲欧洲一区二区三区在线观看| 亚洲精品女人| 欧美日韩一区精品| 久久精品一区二区| 欧美—级a级欧美特级ar全黄| 亚洲一区二区网站| 久久久不卡网国产精品一区| 亚洲国产精品成人| 欧美久久视频| 欧美一区二区三区啪啪| 久久久一区二区| 一区二区高清视频在线观看| 亚洲欧美高清| 亚洲人成啪啪网站| 亚洲欧美另类中文字幕| 在线看片日韩| 亚洲素人在线| 亚洲福利视频网站| 在线视频精品一区| **网站欧美大片在线观看| 一区二区三区福利| 在线电影国产精品| 亚洲无线一线二线三线区别av| 亚洲第一网站| 亚洲欧美日韩精品久久| 亚洲免费电影在线观看| 欧美在线中文字幕| 亚洲在线视频| 欧美国产先锋| 美女诱惑黄网站一区| 国产精品亚洲美女av网站| 亚洲电影毛片| 精品成人在线观看| 亚洲欧美日韩精品久久奇米色影视 | 欧美日韩视频一区二区三区| 久久久久国产精品一区二区| 欧美三级日本三级少妇99| 欧美成人精品影院| 国产三区二区一区久久|