2015-11-05 22 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)无效,并可能导致崩溃。