2015-11-05 21 views
0

我的代碼是:的valgrind顯示unfreed內存

bool check(const char* word) 
{ 
    char letter; 
    node* nodes = malloc(sizeof(node)); 
    for (int i = 0; isalpha(word[i]) != 0; i++) 
    { 
     letter = tolower(word[i]); 
     if (i == 0) 
     { 
      if (root->children[(int)letter - 96] == NULL) 
       return false; 
      nodes = root->children[(int)letter - 96]; 
     }   
     else 
     { 
      if (nodes->children[(int)letter - 96] == NULL) 
      { 
       return false; 
      } 
      nodes = nodes->children[(int)letter - 96]; 
     }  
    } 
    if (nodes->value == 1) 
     return true; 
    else 
     return false;  
    free (&letter); 
    free (nodes->children); 
    free (&nodes->value); 
    free (nodes); 
} 

Valgrind的說,我做的第4行創建不自由變量,但我不明白爲什麼,因爲我在最後釋放它。

+0

你不要釋放變量;你釋放內存塊。 – immibis

回答

2

這些線

if (nodes->value == 1) 
    return true; 
else 
    return false; 

確保該函數返回前它可以free的任何存儲器。

+1

並且循環內有兩個早期退出也會泄漏內存。 –

+0

我已經修復了我愚蠢的錯誤,所以現在我在每次返回之前給了空閒(節點),但它仍然沒有解決問題 –

+0

您爲'* nodes'分配了內存,但在執行if之前未初始化它 - > children [(int)letter - 96] == NULL)'所以在嘗試'釋放(節點)'之前可能會失敗。 –

1

如果代碼的一個分支從該函數返回,則最終的free(nodes)將不會被調用,您的情況就是這種情況:您有多個路徑return truereturn false

在任何情況下釋放堆棧變量(如在free(&letter)中)沒有任何意義,並且這是錯誤的,因爲它不是動態分配的。這也適用於子對象。

的黃金法則是,你需要爲每個malloc/calloc一個free,在你的代碼中有1 calloc和4 free,這意味着要爲未在堆上分配的東西釋放內存(nodes->children, &nodes->value, &letter

+0

我已經修復了我愚蠢的錯誤,所以現在我在每次返回之前給了空閒(節點),但它仍然沒有解決問題 –

0

您確定此代碼格式正確嗎?

您的功能不僅在if (nodes->value)...之前完成,而且兩個分支都會返回一個值。這意味着你永遠不會從if部分進展到free(...)陳述。

此外,您永遠不必釋放本地/堆棧值。 free(&letter)無效,並可能導致崩潰。