【发布时间】:2018-01-17 15:38:54
【问题描述】:
我目前正在尝试使用 recursive function 成功释放 TRIE structure,但无济于事,但我发现内存丢失。
trie结构定义为:
typedef struct node
{
bool is_word;
struct node* children[27];
}
node;
并且我在全局范围内声明了以下 Node*:
node* trie = NULL;
node* root = NULL;
第二个仅用于跟踪根节点,第一个用于从文件中接收单词。到目前为止,在不释放堆内存的情况下编译程序时,除了内存丢失之外,我没有收到任何错误。
在实现了一个 unload( ) 函数后,我开始遇到Segmentation Fault 错误。
查看我的代码的 sn-p:
/*
Frees node by node recursively
*/
bool freeSpace(node* child)
{
for (int i = 0; i < 27; i++)
{
if(trie->children[i] != NULL)
{
freeSpace(trie->children[i]);
}
}
free(trie);
return true;
}
/**
* Unloads dictionary from memory. Returns true if successful else false.
*/
bool unload()
{
if(root != NULL)
{
trie = root;
freeSpace(trie);
if(freeSpace(trie))
return true;
else
return false;
}
else
{
return false;
}
}
也许我的代码在返回值和验证方面不是很聪明,但我现在的主要问题是保证递归按预期工作并且没有内存泄漏或发生分段错误。有什么建议吗?
提前致谢!
【问题讨论】:
-
为什么要释放两次?
freeSpace(trie); if(freeSpace(trie))... -
为什么在
unload函数中调用freeSpace两次?第二次,您当然会收到段错误 -
应该
bool freeSpace(node* child)是bool freeSpace(node* trie)吗?否则,它似乎没有意义。 -
为什么
freeSpace需要返回一个值? -
@IanAbbott
trie是全局变量,所以child是这里的冗余变量。