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 true
或 return 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)
无效,可能会导致崩溃。
我的代码是:
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 true
或 return 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)
无效,可能会导致崩溃。