最近在進行專案開發的時候犯了一個比較低階的錯誤。程式碼的大概結構如下
void func() {
// 其中num1, num2以及num都是常常數
float *p1 = (float*)malloc(num1);
float *p2 = (float*)malloc(num2);
int total;
if (total < num)
{
return 1;
}
free(p1);
p1 = NULL;
free(p2);
p2 = NULL;
}
在使用valgrind進行記憶體洩漏測試的時候,測了大多數資料都沒有記憶體洩漏,以為程式碼就沒有問題了。然後昨天無意中測了一條資料,發現出現了記憶體洩漏,並且洩漏的大小等於分配的兩個陣列大小,即num1 * sizeof(float) + num2*sizeof(float)
,且記憶體洩漏的地方定位在兩個malloc
函式。當時想的是
- 為啥對大部分資料進行測試都沒有出現問題,偏偏這一條出現的記憶體洩漏呢?
- 為啥整條資料跑下來,只洩漏了
num1 * sizeof(float)+num2*sizeof(float)
? - 為啥
malloc
後面跟上了對應的free
,還會出現記憶體洩漏呢?
後來審閱程式碼的時候,發現問題出現在了if
判斷。因為對於大部分資料,這個if
條件是不成立的,因此記憶體就像測的時候那樣沒有洩漏。但是當進入if
語句時,此時直接就返回了,並沒有釋放掉記憶體,導致出現了洩漏。正確的程式碼如下:
void func() {
// 其中num1, num2以及num都是常常數
float *p1 = (float*)malloc(num1);
float *p2 = (float*)malloc(num2);
int total;
if (total < num)
{
free(p1);
p1 = NULL;
free(p2);
p2 = NULL;
return 1;
}
free(p1);
p1 = NULL;
free(p2);
p2 = NULL;
}
程式設計之路,路漫漫其修遠兮,吾將上下而求索。
微信公眾號:音訊探險記
本作品採用《CC 協議》,轉載必須註明作者和本文連結