2柬批、2018-1-12.?C/C++程序穩(wěn)健性的關鍵之一,內存泄露吝镣。當科研成果要順利的用于產業(yè)界時睬塌,必須要經受住長時間運行程序和算法高頻次調用的考驗泉蝌。自身編寫的程序造成會內存泄露的原因主要有以下幾點:
a、malloc/calloc和free對應, new/new type [] 和delete/delete[]對應揩晴。使用內存的時候勋陪,切記何時釋放。
b硫兰、程序架構龐大诅愚,模塊眾多時,接口設計和使用說明必須明確劫映。以免造成函數內部申請的內存违孝,調用函數后刹前,卻未在外部釋放。
c雌桑、對于結構體指針的內存申請和釋放喇喉,建議編寫特定對應申請和釋放函數,以免和free/delete混淆校坑,同時也便于及時檢測發(fā)現錯誤拣技,起到一定的規(guī)范性。
1耍目、2017-3-26.?從昨天晚上到今天中午膏斤,竟然出現了申請內存都會出現錯誤。Critical error detected c0000374 (錯誤1)和Free Heap block XXXXXX modified at XXXXXX after it was freed(錯誤2)和Unhandled exception制妄,Heap corruption(錯誤3)的錯誤掸绞。經過再三的調試和檢測泵三,整個工程的邏輯和算法沒有錯誤耕捞,于是非常糾結。
在C/C++中malloc/calloc和free相匹配烫幕,new和delete(delete[])相匹配俺抽。通常,內存泄漏的本質原因都是申請了內存而未手動釋放较曼,動態(tài)分配的內存如果沒有釋放磷斧,則該內存區(qū)域會一直占用直到整個程序結束,在實際大型工程中捷犹,是不允許存在的弛饭,否則處理器運行不久就會越來越卡,只能重啟萍歉。
出現錯誤1-3侣颂,都會導致堆內存塊損壞。經過仔細排查枪孩,終于找到癥結所在憔晒。需要注意以下幾點:
a、對于錯誤2蔑舞,錯誤3. 可能的原因是由于申請時就出現了問題拒担,或者申請和釋放的內存不是同一區(qū)域導致,在申請內存時要一定保證類型相同攻询。
struct point2i{
int x,y;
};
//錯誤point2i -->int从撼,這種做法極其容易導致程序出現訪問錯誤
int? ? * buffer_temp = (int*)calloc(length,sizeof(point2i));
free(buffer_temp);//如果中途將指針buffer_temp被修改,會導致釋放錯誤钧栖,地址指針要保護好
b低零、對于錯誤1呆馁,是由于內存被越界處理導致。
例如使用memset時毁兆,指定memset的長度超過了申請的內存長度浙滤,導致處理越界。
int? ? * buffer_temp2 = (int*)calloc(length,sizeof(int));
錯誤:memset(buffer_temp2, 0,sizeof(point2i)*length);//sizeof(point2i)*length
>sizeof(int)*length
錯誤:memset(buffer_temp2, 0,sizeof(int)*(length+n));
總結:申請和釋放內存要對應气堕,類型要注意纺腊;運用memset高速賦值時,注意處理區(qū)域長度茎芭;當出現申請內存出現錯誤時揖膜,很有可能是該內存沒有被申請便被越界使用了,導致申請該片內存時造成沖突梅桩。
驢兒先生筆記壹粟,不斷更新中zzz...