




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
常見(jiàn)的內(nèi)存錯(cuò)誤及其對(duì)策第1頁(yè),共15頁(yè),2023年,2月20日,星期一常見(jiàn)的內(nèi)存錯(cuò)誤及其對(duì)策常見(jiàn)錯(cuò)誤1:內(nèi)存分配未成功,卻使用了它起因沒(méi)有意識(shí)到內(nèi)存分配會(huì)不成功編程新手容易犯解決對(duì)策在使用內(nèi)存之前,檢查指針是否為空指針(NULL)
if(p==NULL) { printf("Noenoughmemory!\n"); exit(0); }第2頁(yè),共15頁(yè),2023年,2月20日,星期一常見(jiàn)的內(nèi)存錯(cuò)誤及其對(duì)策常見(jiàn)錯(cuò)誤2:內(nèi)存分配成功,但是尚未初始化就引用它起因沒(méi)有初始化的觀念誤以為內(nèi)存的默認(rèn)值全為0解決對(duì)策即使是賦0值也不可省略,不要嫌麻煩第3頁(yè),共15頁(yè),2023年,2月20日,星期一常見(jiàn)的內(nèi)存錯(cuò)誤及其對(duì)策常見(jiàn)錯(cuò)誤3:內(nèi)存分配成功,并且已經(jīng)初始化,但操作越過(guò)了內(nèi)存的邊界例如:使用數(shù)組時(shí)經(jīng)常發(fā)生下標(biāo)“多1”或者“少1”的操作解決對(duì)策:在for語(yǔ)句中,注意循環(huán)次數(shù)不要搞錯(cuò)第4頁(yè),共15頁(yè),2023年,2月20日,星期一常見(jiàn)的內(nèi)存錯(cuò)誤及其對(duì)策常見(jiàn)錯(cuò)誤4:忘記釋放內(nèi)存,造成內(nèi)存泄漏(MemoryLeak)“內(nèi)存泄露”一詞類似“原料泄露”泄露出去的原料不能被利用,導(dǎo)致生產(chǎn)過(guò)程中原料不足好比借東西不還如果申請(qǐng)來(lái)的內(nèi)存不用,別的程序也不能用,就好像這塊內(nèi)存泄露出去一樣,造成浪費(fèi)第5頁(yè),共15頁(yè),2023年,2月20日,星期一常見(jiàn)的內(nèi)存錯(cuò)誤及其對(duì)策特征含有這種錯(cuò)誤的函數(shù),每被調(diào)用一次,就丟失一塊內(nèi)存(制造內(nèi)存垃圾)剛開(kāi)始時(shí),系統(tǒng)內(nèi)存充足,看不到任何錯(cuò)誤當(dāng)系統(tǒng)運(yùn)行相當(dāng)一段時(shí)間后,就會(huì)突然死掉,出現(xiàn)提示:內(nèi)存耗盡需長(zhǎng)期穩(wěn)定運(yùn)行的服務(wù)程序?qū)?nèi)存泄漏最敏感嚴(yán)重程度取決于每次遺留內(nèi)存垃圾的多少代碼被調(diào)用的次數(shù)第6頁(yè),共15頁(yè),2023年,2月20日,星期一常見(jiàn)的內(nèi)存錯(cuò)誤及其對(duì)策解決對(duì)策在需要的時(shí)候才malloc,并盡量減少malloc的次數(shù)malloc的執(zhí)行效率就不高,過(guò)多的malloc使程序性能下降能用自動(dòng)變量解決的問(wèn)題,就不要用malloc來(lái)解決malloc一般在大塊內(nèi)存分配和動(dòng)態(tài)內(nèi)存分配時(shí)使用重復(fù)使用malloc申請(qǐng)到的內(nèi)存盡量讓malloc和與之配套的free在一個(gè)函數(shù)或模塊內(nèi)盡量把malloc集中在函數(shù)的入口處,free集中在函數(shù)的出口處以上做法只能盡量降低產(chǎn)生泄露的概率。完全杜絕內(nèi)存泄露,關(guān)鍵要靠程序員的細(xì)心與責(zé)任感第7頁(yè),共15頁(yè),2023年,2月20日,星期一一個(gè)例子voidInit(void){pszMyName=(char*)malloc(256);
if(pszMyName==NULL){
return;}pszHerName=(char*)malloc(256);
if(pszHerName==NULL){
return;}pszHisName=(char*)malloc(256);
if(pszHisName==NULL){
return;}
……
free(pszMyName);free(pszHerName);free(pszHisName);
return;}
錯(cuò)在哪里!第8頁(yè),共15頁(yè),2023年,2月20日,星期一一個(gè)例子voidInit(void){pszMyName=(char*)malloc(256);
if(pszMyName==NULL){
return;}pszHerName=(char*)malloc(256);
if(pszHerName==NULL){
free(pszMyName);
return;}pszHisName=(char*)malloc(256);
if(pszHisName==NULL){
free(pszMyName);free(pszHerName);
return;}
……
free(pszMyName);free(pszHerName);free(pszHisName);
return;}第9頁(yè),共15頁(yè),2023年,2月20日,星期一常見(jiàn)的內(nèi)存錯(cuò)誤及其對(duì)策常見(jiàn)錯(cuò)誤5:釋放了內(nèi)存,卻繼續(xù)使用它起因:指針?biāo)傅膬?nèi)存被釋放以后,并不表示指針會(huì)消亡其地址仍然不變(非NULL),只是該地址對(duì)應(yīng)的內(nèi)存是垃圾指向垃圾內(nèi)存的指針是“野指針”…free(ptr); if(ptr!=NULL)//不起作用{ …}第10頁(yè),共15頁(yè),2023年,2月20日,星期一常見(jiàn)的內(nèi)存錯(cuò)誤及其對(duì)策char*GetInput(void)
{
chars[80];
scanf("%s",s);
returns;
}
warningC4172:returningaddressoflocalvariableortemporary輸出亂碼voidGetInput(char*s)
{
scanf("%s",s);
}
錯(cuò)在哪里!不能把局部變量的地址作為返回值返回函數(shù)返回后,局部變量被釋放,該地址的內(nèi)存會(huì)被挪做它用第11頁(yè),共15頁(yè),2023年,2月20日,星期一常見(jiàn)的內(nèi)存錯(cuò)誤及其對(duì)策#include<stdio.h>#include<stdlib.h>voidGetInput(char*p){ p=(char
*)malloc(100);}程序崩潰,函數(shù)不能傳遞動(dòng)態(tài)分配的內(nèi)存?voidGetInput(char
**p){
*p=(char*)malloc(100);}第12頁(yè),共15頁(yè),2023年,2月20日,星期一常見(jiàn)的內(nèi)存錯(cuò)誤及其對(duì)策常見(jiàn)錯(cuò)誤5解決對(duì)策盡量把malloc集中在函數(shù)的入口處,free集中在函數(shù)的出口處如果free不能放在函數(shù)出口處,則指針free后立即設(shè)置為NULL不要把局部變量的地址作為返回值返回,因?yàn)樵搩?nèi)存在函數(shù)體結(jié)束時(shí)被自動(dòng)銷(xiāo)毀指針要么初始化為NULL,要么是其指向合法的內(nèi)存第13頁(yè),共15頁(yè),2023年,2月20日,星期一非法內(nèi)存操作起因內(nèi)存分配未成功,卻使用了它內(nèi)存分配成功,但是尚未初始化就引用它內(nèi)存分配成功,并且已經(jīng)初始化,但操作越過(guò)了內(nèi)存的邊界釋放了內(nèi)存,卻繼續(xù)使用它基本特征代碼訪問(wèn)了不該訪問(wèn)的內(nèi)存地
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中文溝通知到課后答案智慧樹(shù)章節(jié)測(cè)試答案2025年春魯東大學(xué)
- 重慶市南開(kāi)中學(xué)2024-2025學(xué)年高三下學(xué)期第六次質(zhì)量檢測(cè)(2月)政治試題
- 高考物理課標(biāo)版一輪復(fù)習(xí)考點(diǎn)規(guī)范練21力學(xué)三大觀點(diǎn)的綜合應(yīng)用
- 2024-2025學(xué)年高中物理講義(人教版2019)15機(jī)械能守恒定律
- 云南省中央民大附中芒市國(guó)際學(xué)校2017-2018學(xué)年高一上學(xué)期末考試數(shù)學(xué)試卷
- 高考數(shù)學(xué)(人教A版)一輪復(fù)習(xí)單元質(zhì)檢四三角函數(shù)解三角形A
- 民居改造施工方案
- DB13/T 2311-2015 河北省預(yù)拌砂漿技術(shù)規(guī)程
- 加強(qiáng)建設(shè)工程施工合同管理有效防范工程承包法律風(fēng)險(xiǎn)
- 西藏阿里地區(qū)乙型肝炎病毒攜帶率和分子流行病學(xué)研究
- 北京廣通信達(dá)it運(yùn)維管理平臺(tái)簡(jiǎn)介-20210818003557
- DB33 1121-2016 民用建筑電動(dòng)汽車(chē)充電設(shè)施配置與設(shè)計(jì)規(guī)范
- 石油化工企業(yè)班組安全建設(shè)培訓(xùn)課件
- DB31∕731-2020 船舶修正總噸單位產(chǎn)品能源消耗限額
- 3.1.1農(nóng)業(yè)區(qū)位因素及其變化-農(nóng)業(yè)區(qū)位因素教學(xué)課件高中地理人教版(2019)必修二
- 《文化的基本內(nèi)涵》課件
- 探索人工智能世界
- 食材配送服務(wù)方案投標(biāo)文件(技術(shù)方案)
- 精通版四年級(jí)下冊(cè)小學(xué)英語(yǔ)全冊(cè)單元測(cè)試卷(含聽(tīng)力音頻文件)
- 中國(guó)慢性阻塞性肺疾病基層診療指南(2024年)解讀
- 八年級(jí)地理下冊(cè) 8.3 新疆維吾爾自治區(qū)的地理概況與區(qū)域開(kāi)發(fā)說(shuō)課稿 (新版)湘教版
評(píng)論
0/150
提交評(píng)論