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

标签 c memory-management memory-leaks 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]);
}

“free”函数的三个调用现在被标记为 comcomts,因为:

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

但是,由于我只插入了一个后缀,所以我失去了对前缀的控制。

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

此外,当尝试将字符串 word 复制到 insert 函数内的 char word1[256] 并取消注释那些你释放的,一切都停止工作。

如果有任何解决方法,我将不胜感激,

最佳答案

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

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

此外,您真的应该在依赖具有有效值的变量之前检查sscanf() 是否成功。如果它不返回 3,则存在解析问题并且并非所有字符串都已分配。检查返回值。

关于c - 释放为 C 中的字符串分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29915285/

相关文章:

ios - 有关仪器内存泄漏检测的问题

c - 收到无效的初始化程序错误

C "string"init - 哪个更好?

java - 什么时候触发 Full GC?

c++ - size_t 和内存分配

memory-management - 使用道场后如何清理?

objective-c - 修复 iPhone 内存泄漏,入门

c - 通过 uart 的 esp32 printf channel (esp-idf)

c - c中的多个条件变量

cocoa-touch - 字符串操作没有内存泄漏?