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...