释放为C中的字符串分配的内存

时间:2015-04-28 09:18:04

标签: c memory-management memory-leaks trie

我遇到了内存分配问题并解决了问题。

我正在尝试使用压缩trie(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]);
}

“免费”功能的三个调用现在标记为表示,因为:

insert函数有两个参数:trie和char *word。在这个函数中,我将word后缀插入到一个新的trie中。这意味着我不想立即释放为字符串分配的内存。

但是,由于我只插入后缀,因此我无法控制前缀。

这意味着如果在清除trie的clear函数内部调用free(node->content),我实际上并不释放所有已分配的内存。

此外,当尝试将word字符串char word1[256]复制到insert函数内的{{1}}并取消评论时,所有内容都会停止工作。

我很感激任何想法如何处理,

1 个答案:

答案 0 :(得分:2)

您的代码中存在一些逻辑错误,在处理动态内存时总是很可怕。

insert()函数需要复制它希望存储的字符串部分,因为它只需要一个前缀。

此外,确实应该在依赖具有有效值的变量之前检查sscanf()是否成功。如果它没有返回3,则会出现解析问题,并且不会分配所有字符串。检查返回值。