C valgrind显示未刷新的内存

C valgrind显示未刷新的内存,c,valgrind,free,C,Valgrind,Free,我的代码是: 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

我的代码是:

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;  
确保函数在释放任何内存之前返回。

这些行

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

确保函数在释放任何内存之前返回。

如果代码的一个分支从函数返回,则不会调用最后的
空闲(节点)
,在您的情况下就是这样:您有多个路径
返回true
返回false

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


黄金法则是,对于每个
malloc/calloc
,您需要一个
free
,在您的代码中有1个
calloc
和4个
free
,这意味着您正在为堆上未分配的内容释放内存(
节点->子节点,&nodes->值,&letter

如果代码的一个分支从函数返回,则不会调用最后的
空闲(节点)
,在您的情况下就是这样:您有多个路径
返回true
返回false

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


黄金法则是,对于每个
malloc/calloc
,您需要一个
free
,在您的代码中有1个
calloc
和4个
free
,这意味着您正在为堆上未分配的内容释放内存(
节点->子节点,&nodes->值,&letter

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

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


此外,您不必释放本地/堆栈值<代码>免费(&letter)无效,可能会导致崩溃。

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

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


此外,您不必释放本地/堆栈值
free(&letter)
无效,可能会导致崩溃。

不释放变量;释放内存块,不释放变量;您可以释放内存块。循环中有两个早期出口也会泄漏内存。我已经修复了我愚蠢的错误,所以现在我在每次返回之前都会释放(节点),但它仍然没有解决您为
*节点分配内存的问题,但在执行
if(nodes->children[(int)letter-96]==NULL之前没有初始化它
因此,在您尝试
释放(节点)
之前,它可能就失败了所以天知道你想释放什么!您丢失了指向未初始化结构字段的分配内存指针。循环中有两个早期出口也会泄漏内存。我已修复了我的愚蠢错误,因此现在我在每次返回之前都会释放(节点),但是它仍然没有解决您为
*节点分配内存的问题,但是在执行
if(nodes->children[(int)letter-96]==NULL)
之前没有初始化它,所以在您尝试
释放(nodes)
之前它可能就失败了所以天知道你想释放什么!您丢失了指向未初始化结构域的分配内存指针。我已修复了我的愚蠢错误,因此现在我在每次返回之前提供了空闲(节点),但仍然没有解决问题我已修复了我的愚蠢错误,因此现在我在每次返回之前提供了空闲(节点),但仍然没有解决问题