在malloc和free上的一天

wilder_ting發表於2021-04-02

最近在進行專案開發的時候犯了一個比較低階的錯誤。程式碼的大概結構如下

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 協議》,轉載必須註明作者和本文連結

相關文章