【发布时间】:2015-07-07 01:26:01
【问题描述】:
我遇到了内存分配和释放问题。
我正在尝试使用压缩特里树 (Patricia) 来实现字典。我有一个 trie 库,当我从 main 调用它的函数时它可以正常工作。但是,我在尝试解析输入时遇到了一点问题。
我有一个解析器库,它从标准输入中读取一个单词并从 trie 库中调用 insert 函数。它是这样称呼的:
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”函数的三个调用现在被标记为commets,因为:
insert 函数有两个参数:一个 trie 和一个 char *word。在这个函数中,我将word 的suffix 插入到一些新的trie 中。这意味着我不想立即释放为字符串分配的内存。
但是,由于我只插入了一个后缀,我无法控制前缀。
这意味着如果在清除 trie 的 clear 函数中调用 free(node->content),我实际上并没有释放所有分配的内存。
此外,当尝试将字符串word 复制到insert 函数内的char word1[256] 并取消注释那些你释放的内容时,一切都停止工作了。
如果有任何解决方法的想法,我将不胜感激,
【问题讨论】:
-
你在哪里分配内存?你只分配了一个指针数组
-
哇。我从未见过
%ms,不得不check the manual page。 -
sscanf 期间的@Leeor
-
正如有人已经说过的那样,您正在将指针数组初始化为零,但实际上并未为这些指针分配任何内存
-
我认为我们需要
insert函数来回答您的问题。没有它,你的最后一句话有点神秘。
标签: c memory-management memory-leaks trie