valgrind表现出不同意的记忆

时间:2015-11-05 00:29:48

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

3 个答案:

答案 0 :(得分:2)

这些行

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

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

答案 1 :(得分:1)

如果代码的某个分支从函数返回,则不会调用最终free(nodes),这种情况就是这种情况:您有多条路径return true或{{1 }}

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

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

答案 2 :(得分:0)

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

您的功能不仅在array( 'message', 'send', '--title', 'Hello there', '--text', 'How are you doing?' ) 之前完成,而且两个分支都返回一个值。这意味着您永远不会从if (nodes->value)...部分升级到if声明。

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