valgrind 显示未释放的内存

valgrind shows unfreed memory

我的代码是:

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 行中创建的变量,但我不明白为什么,因为我在最后释放了它。

这些行

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

确保函数returns之前可以free任何内存。

如果您的代码 returns 来自函数的分支,则不会调用最终的 free(nodes),您的情况就是这种情况:您有多个路径 return truereturn false.

在任何情况下,释放堆栈变量(如 free(&letter) 中)没有任何意义,这是一个错误,因为它不是动态分配的。这也适用于子对象。

黄金法则是每个 malloc/calloc 需要一个 free,在你的代码中你有 1 个 calloc 和 4 个 free,这意味着你是为堆上未分配的东西释放内存 (nodes->children, &nodes->value, &letter)

您确定此代码的格式正确吗?

不仅您的函数在 if (nodes->value)... 之前完成,而且两个分支 return 都有一个值。这意味着您永远不会从 if 部分进展到 free(...) 语句。

此外,您永远不必释放 local/stack 值。 free(&letter) 无效,可能会导致崩溃。