




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 休養(yǎng)所老年公寓設(shè)計(jì)與運(yùn)營(yíng)創(chuàng)新策略考核試卷
- 意外傷害保險(xiǎn)與保險(xiǎn)行業(yè)的風(fēng)險(xiǎn)管理與案例分析研究分析考核試卷
- 家用紡織品的供應(yīng)鏈管理與物流優(yōu)化考核試卷
- 車險(xiǎn)理賠合規(guī)培訓(xùn)課件
- 花生銷售合同范本
- 裝修押金轉(zhuǎn)讓合同范本
- 抵押的車位合同范本
- 寄養(yǎng)羊合同范本
- 小學(xué)生態(tài)平衡課件
- 超市促銷培訓(xùn)課件
- 海南省澄邁縣2024-2025學(xué)年七年級(jí)上學(xué)期期末考試地理試題(含答案)
- 2025年蘇州衛(wèi)生職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 部編人教版五年級(jí)下冊(cè)小學(xué)數(shù)學(xué)全冊(cè)教案
- 2024年世界職業(yè)院校技能大賽高職組“聲樂(lè)、器樂(lè)表演組”賽項(xiàng)參考試題庫(kù)(含答案)
- 2024年共青團(tuán)入團(tuán)考試題庫(kù)及答案
- 2024解析:第十二章機(jī)械效率-講核心(原卷版)
- 2023年國(guó)家公務(wù)員錄用考試《申論》真題(副省卷)及答案解析
- 2024-2030年中國(guó)醫(yī)療器械維修設(shè)備行業(yè)供需狀況及發(fā)展策略分析報(bào)告
- 中國(guó)心力衰竭診斷和治療指南2024解讀(完整版)
- 女性健康知識(shí)講座課件
- DB11T 1787-2020 二氧化碳排放核算和報(bào)告要求 其他行業(yè)
評(píng)論
0/150
提交評(píng)論