我的代码是:
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 :(得分: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(...)
无效,可能会导致崩溃。