我在内存分配和释放方面遇到了问题。
我正在尝试使用压缩字典树(Patricia)来实现一个字典。我有一个Trie库,当我从主函数调用其功能时,它可以正常工作。然而,在尝试解析输入时,我遇到了一些小问题。
我有一个解析库,从标准输入读取单词并调用Trie库中的“插入”函数。它是这样调用的:
我正在尝试使用压缩字典树(Patricia)来实现一个字典。我有一个Trie库,当我从主函数调用其功能时,它可以正常工作。然而,在尝试解析输入时,我遇到了一些小问题。
我有一个解析库,从标准输入读取单词并调用Trie库中的“插入”函数。它是这样调用的:
void tryInsert(char *commandLine, struct tree *t) {
char *arg[3] = { NULL };
sscanf(commandLine, "%ms %ms%ms", &arg[0], &arg[1], &arg[2]);
if (arg[1] == 0 || arg[2] != 0 || !consistsOfSmallCases(arg[1]))
printf("ignored\n");
else
//inserting arg[1] into tree
insert(t, arg[1]);
// free(arg[0]);
// free(arg[1]);
// free(arg[2]);
}
"free" 函数的三个调用现在被标记为注释,因为:
insert
函数有两个参数:一个 trie 和一个 char *word
。在这个函数内部,我将 word
的一个后缀插入到 trie 的某个新位置。这意味着我不想立即释放为字符串分配的内存。
然而,由于我只插入了一个后缀,我失去了前缀的控制权。
这意味着如果在清除 trie 的 clear
函数内部调用 free(node->content)
,我实际上并没有释放所有的已分配内存。
此外,在尝试将字符串 word
复制到 char word1[256]
中并取消注释那三个释放时,一切都停止了工作。
我将感激任何关于如何处理这个问题的想法。
%ms
,不得不查看手册页。 - unwind