內(nèi)存出錯(cuò)-內(nèi)存泄露-數(shù)組越界-懸空指針-錯(cuò)誤分配_第1頁(yè)
內(nèi)存出錯(cuò)-內(nèi)存泄露-數(shù)組越界-懸空指針-錯(cuò)誤分配_第2頁(yè)
內(nèi)存出錯(cuò)-內(nèi)存泄露-數(shù)組越界-懸空指針-錯(cuò)誤分配_第3頁(yè)
內(nèi)存出錯(cuò)-內(nèi)存泄露-數(shù)組越界-懸空指針-錯(cuò)誤分配_第4頁(yè)
內(nèi)存出錯(cuò)-內(nèi)存泄露-數(shù)組越界-懸空指針-錯(cuò)誤分配_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 內(nèi)存出錯(cuò),內(nèi)存泄露,數(shù)組越界,懸空指針,錯(cuò)誤分配2010-06-01 10:43 879人閱讀 評(píng)論(3) 收藏 舉報(bào)內(nèi)存出錯(cuò)(包括4個(gè)). 數(shù)組越界;. 內(nèi)存泄露;. 懸空指針(野指針);. 錯(cuò)誤分配。 1.     數(shù)組越界:程序反應(yīng): 跳出“內(nèi)存不足?!碧崾究?。調(diào)試的時(shí)候無(wú)法定位到準(zhǔn)確的出錯(cuò)點(diǎn),也就是程序崩潰的地方不確定。但是大致出錯(cuò)會(huì)在數(shù)組所在的函數(shù)里面或調(diào)用了數(shù)組的函數(shù)里,如果總彈出以上對(duì)話框,就檢查出錯(cuò)代碼附近是否有用到數(shù)

2、組,特別是邊界處要仔細(xì)檢查。應(yīng)用vector的時(shí)候也要注意越界問(wèn)題。2. 內(nèi)存泄露new后一定要delete,malloc之后一定要free。程序反應(yīng):一是可能像上面一樣彈出對(duì)話框提示。/一般不會(huì)出現(xiàn)。二是可能在Debug版下編譯運(yùn)行均不會(huì)崩潰,但是Release版下會(huì)導(dǎo)致程序崩潰,這一般是內(nèi)存泄露的問(wèn)題。2.1:1. delete的時(shí)候?yàn)槭裁磿?huì)報(bào)錯(cuò)?2.在哪里delete比較合適?BOOL  Test(char*& ptStr)        CString 

3、60;temp;       temp = m_pListCtrl->GetItemText(iRow, iCol);        ilen = temp.GetLength()+1;   /必須加1       ptStr = new charilen;       s

4、trcpy(ptStr,temp);           / delete ptStr;       return TRUE;void CallTest()       char* cstemp = NULL;for( i=0;i<Count;i+)        

5、;             Test(cstemp);delete cstemp;           2.2:構(gòu)造函數(shù)和析構(gòu)函數(shù)對(duì)指針的操作class CFM3Dlgpublic:       CFM3Dlg();      &

6、#160;CFM3Dlg(); Cs2 * cs2;CFM3Dlg:CFM3Dlg()       cs2 = NULL;CFM3Dlg:CFM3Dlg()       if (cs2)                     delete

7、 cs2;              cs2 = NULL;               / 用cs2指針之前最好先判斷cs2指針是否為空。2.3:來(lái)自資源錯(cuò)誤管理的潛在堆內(nèi)存丟失int getkey(char *filename)FILE *fp;int key;fp = fopen(filena

8、me, "r");fscanf(fp, "%d", &key);return key;“資源”不一定僅僅指“內(nèi)存”,如FILE句柄可能與內(nèi)存塊不同,但是必須對(duì)它們給予同等關(guān)注。fopen的語(yǔ)義需要補(bǔ)充性的 fclose。在沒(méi)有 fclose()的情況下,C 標(biāo)準(zhǔn)不能指定發(fā)生的情況時(shí),很可能是內(nèi)存泄漏。其他資源(如信號(hào)量、網(wǎng)絡(luò)句柄、數(shù)據(jù)庫(kù)連接等)同樣值得考慮,像excel中的一些應(yīng)用,用完后也都要release。 2.4:new時(shí)用了,delete時(shí)也要用。new時(shí)沒(méi)有用,delete時(shí)也不要用。string

9、 *stringarray = new string100;.delete stringarray; stringarray指向的100個(gè)string對(duì)象中的99個(gè)不會(huì)被正確地摧毀,因?yàn)樗麄兊奈鰳?gòu)函數(shù)永遠(yuǎn)不會(huì)被調(diào)用。 string *stringptr1 = new string;string *stringptr2 = new string100;.delete stringptr1;/ 刪除一個(gè)對(duì)象delete stringptr2;/ 刪除對(duì)象數(shù)組 2.5:內(nèi)存耗盡怎么辦?如果在申請(qǐng)動(dòng)態(tài)內(nèi)存時(shí)找不到足夠大的內(nèi)存塊,malloc和new將返

10、回NULL指針,宣告內(nèi)存申請(qǐng)失敗。通常有三種方式處理“內(nèi)存耗盡”問(wèn)題。(1)判斷指針是否為NULL,如果是則馬上用return語(yǔ)句終止本函數(shù)。例如:void Func(void)    A *a = new A;/int     if(a = NULL)/對(duì)于內(nèi)存有限的小機(jī)最好作此判斷            return;     

11、60;  (2)判斷指針是否為NULL,如果是則馬上用exit(1)終止整個(gè)程序的運(yùn)行。例如:void Func(void)    A *a = new A;    if(a = NULL)            std:cout << “Memory Exhausted” << std:endl;    

12、0;   exit(1);        (3)為new和malloc設(shè)置異常處理函數(shù)。例如Visual C+可以用set_new_hander函數(shù)為new設(shè)置用戶自己定義的異常處理函數(shù)。在<new>文件中有:typedef void (*new_handler)();new_handler set_new_handler(new_handler p) throw();用戶自定義:void nomorememory()    

13、0;  std:cerr << "unable to satisfy request for memory/n"       abort();void OnCancel()       set_new_handler(nomorememory);     /報(bào)錯(cuò)/set_new_handler(NULL);    &

14、#160;      /調(diào)用std:bad_alloc異常, bad_alloc是operator new不能滿足內(nèi)存分配請(qǐng)求時(shí)拋出的異常類型。       int *pbigdataarray = new int1000000000;3.   懸空指針(野指針)“調(diào)試”難以識(shí)別懸空指針?!耙爸羔槨辈皇荖ULL指針,是指向“垃圾”內(nèi)存的指針。人們一般不會(huì)錯(cuò)用NULL指針,因?yàn)橛胕f語(yǔ)句很容易判斷。但是“野指針”是很危險(xiǎn)的,if

15、語(yǔ)句對(duì)它不起作用。 “野指針”的原因主要有如下幾種:(1)指針變量沒(méi)有被初始化。任何指針變量剛被創(chuàng)建時(shí)不會(huì)自動(dòng)成為NULL指針,它的缺省值是隨機(jī)的,它會(huì)亂指一氣。所以,指針變量在創(chuàng)建的同時(shí)應(yīng)當(dāng)被初始化,要么將指針設(shè)置為NULL,要么讓它指向合法的內(nèi)存。例如char *ip = NULL;char *ip = new char;(2)指針ip被free或者delete之后,沒(méi)有置為NULL,讓人誤以為ip是個(gè)合法的指針。     Delete后ip所指的對(duì)象清空,但指針仍然還有值。若內(nèi)存在釋放后立即被覆蓋,并且新指向的值不同于預(yù)期值,但

16、是卻很難識(shí)別出新值是錯(cuò)誤值。(3)指針操作超越了變量的作用范圍。這種情況讓人防不勝防,示例程序如下:class A    public:    void Func(void) std:cout << “Func of class A” << std:endl; ;void Test(void)    A *p;            

17、A a;        p = &a; / 注意 a 的生命期         p->Func(); / p是“野指針”函數(shù)Test在執(zhí)行語(yǔ)句p->Func()時(shí),對(duì)象a已經(jīng)消失,而p是指向a的,所以p就成了“野指針”。但奇怪的是有些編譯器運(yùn)行這個(gè)程序時(shí)居然沒(méi)有出錯(cuò),這可能與編譯器有關(guān)。4.   錯(cuò)誤分配錯(cuò)誤分配的管理不是很困難, 此類錯(cuò)誤都會(huì)被快速地檢測(cè)到。4.1兩個(gè)錯(cuò)誤的內(nèi)存釋放/* Allocate once, free twice. */void f3()    char *p;    p = malloc(10);     .    free(p);     . 

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論