2015-11-05 2 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 (nodes -> children [(int) letter - 96] == NULL) ', поэтому он, вероятно, не работает даже до того, как вы попытаетесь« освободить (узлы) ». –

1

Если ветка вашего кода вернется из функции, окончательный free(nodes) не будет вызываться, что имеет место в вашей ситуации: у вас есть несколько путей return true или return false.

В любом случае освобождение переменной стека (как в free(&letter)) не имеет никакого смысла, и это ошибка, поскольку она не динамически распределена. Это относится и к под-объектам.

Золотое правило является то, что вам нужно free для каждого malloc/calloc, в вашем коде у вас есть 1 calloc и 4 free, что означает, что вы освобождаете память для вещей, которые не выделены в куче (nodes->children, &nodes->value, &letter)

+0

Я исправил свои глупые ошибки, поэтому теперь я дал бесплатные (узлы) перед каждым возвратом, но он все еще не решил проблему –

0

Вы уверены, что этот код правильно отформатирован?

Не только ваша функция заканчивается до if (nodes->value)..., но и обе ветви возвращают значение. Это означает, что вы никогда не переходите от if к операциям free(...).

Также вам не нужно освобождать значения локального/стека. free(&letter) недействителен и, скорее всего, вызовет сбой.