C/C++內(nèi)存泄漏與出錯(cuò)分析

2、2018-1-12.?C/C++程序穩(wěn)健性的關(guān)鍵之一,內(nèi)存泄露。當(dāng)科研成果要順利的用于產(chǎn)業(yè)界時(shí),必須要經(jīng)受住長(zhǎng)時(shí)間運(yùn)行程序和算法高頻次調(diào)用的考驗(yàn)。自身編寫的程序造成會(huì)內(nèi)存泄露的原因主要有以下幾點(diǎn):

a、malloc/calloc和free對(duì)應(yīng), new/new type [] 和delete/delete[]對(duì)應(yīng)。使用內(nèi)存的時(shí)候,切記何時(shí)釋放。

b、程序架構(gòu)龐大,模塊眾多時(shí),接口設(shè)計(jì)和使用說明必須明確。以免造成函數(shù)內(nèi)部申請(qǐng)的內(nèi)存,調(diào)用函數(shù)后,卻未在外部釋放。

c、對(duì)于結(jié)構(gòu)體指針的內(nèi)存申請(qǐng)和釋放,建議編寫特定對(duì)應(yīng)申請(qǐng)和釋放函數(shù),以免和free/delete混淆,同時(shí)也便于及時(shí)檢測(cè)發(fā)現(xiàn)錯(cuò)誤,起到一定的規(guī)范性。

1、2017-3-26.?從昨天晚上到今天中午,竟然出現(xiàn)了申請(qǐng)內(nèi)存都會(huì)出現(xiàn)錯(cuò)誤。Critical error detected c0000374 (錯(cuò)誤1)和Free Heap block XXXXXX modified at XXXXXX after it was freed(錯(cuò)誤2)和Unhandled exception,Heap corruption(錯(cuò)誤3)的錯(cuò)誤。經(jīng)過再三的調(diào)試和檢測(cè),整個(gè)工程的邏輯和算法沒有錯(cuò)誤,于是非常糾結(jié)。

在C/C++中malloc/calloc和free相匹配,new和delete(delete[])相匹配。通常,內(nèi)存泄漏的本質(zhì)原因都是申請(qǐng)了內(nèi)存而未手動(dòng)釋放,動(dòng)態(tài)分配的內(nèi)存如果沒有釋放,則該內(nèi)存區(qū)域會(huì)一直占用直到整個(gè)程序結(jié)束,在實(shí)際大型工程中,是不允許存在的,否則處理器運(yùn)行不久就會(huì)越來越卡,只能重啟。

出現(xiàn)錯(cuò)誤1-3,都會(huì)導(dǎo)致堆內(nèi)存塊損壞。經(jīng)過仔細(xì)排查,終于找到癥結(jié)所在。需要注意以下幾點(diǎn):

a、對(duì)于錯(cuò)誤2,錯(cuò)誤3. 可能的原因是由于申請(qǐng)時(shí)就出現(xiàn)了問題,或者申請(qǐng)和釋放的內(nèi)存不是同一區(qū)域?qū)е?,在申?qǐng)內(nèi)存時(shí)要一定保證類型相同。

struct point2i{

int x,y;

};

//錯(cuò)誤point2i -->int,這種做法極其容易導(dǎo)致程序出現(xiàn)訪問錯(cuò)誤

int? ? * buffer_temp = (int*)calloc(length,sizeof(point2i));

free(buffer_temp);//如果中途將指針buffer_temp被修改,會(huì)導(dǎo)致釋放錯(cuò)誤,地址指針要保護(hù)好

b、對(duì)于錯(cuò)誤1,是由于內(nèi)存被越界處理導(dǎo)致。

例如使用memset時(shí),指定memset的長(zhǎng)度超過了申請(qǐng)的內(nèi)存長(zhǎng)度,導(dǎo)致處理越界。

int? ? * buffer_temp2 = (int*)calloc(length,sizeof(int));

錯(cuò)誤:memset(buffer_temp2, 0,sizeof(point2i)*length);//sizeof(point2i)*length
>sizeof(int)*length

錯(cuò)誤:memset(buffer_temp2, 0,sizeof(int)*(length+n));

總結(jié):申請(qǐng)和釋放內(nèi)存要對(duì)應(yīng),類型要注意;運(yùn)用memset高速賦值時(shí),注意處理區(qū)域長(zhǎng)度;當(dāng)出現(xiàn)申請(qǐng)內(nèi)存出現(xiàn)錯(cuò)誤時(shí),很有可能是該內(nèi)存沒有被申請(qǐng)便被越界使用了,導(dǎo)致申請(qǐng)?jiān)撈瑑?nèi)存時(shí)造成沖突。

驢兒先生筆記,不斷更新中zzz...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容