【问题标题】:C - free() doesn't delete my structure malloc [duplicate]C - free() 不会删除我的结构 malloc [重复]
【发布时间】:2023-03-27 07:30:01
【问题描述】:
int main(int argc, char **argv)
{
    counter = 0;
    int size = 5;
    struct trie *mainTrie = malloc(size * sizeof(mainTrie));
    test(mainTrie);
    printf("%c", mainTrie[2].alphabet);
    free(mainTrie->alphabet);
    printf("%c", mainTrie[2].alphabet);
    return 0;
}

测试函数只是为了看看我如何使用 malloc。我的实验是成功的,除了一件事:free(mainTrie)。

当我在“释放”内存空间后添加 printf("%c", mainTrie[2].alphabet) 时,输出仍然给了我存储在 mainTrie[2].alphabet 方法中的相同字母'测试'。

我是不是不明白什么?提前谢谢...

【问题讨论】:

  • 您预计会发生什么,为什么?
  • struct trie *mainTrie = malloc(size * sizeof *mainTrie );
  • free() 确实释放了分配的内存。您在释放内存后访问该内存的尝试具有未定义的行为。只是不要那样做。
  • @wildplasser:是的。同样值得解释的是,问题中的 malloc 调用使用了错误的大小。它为 5 个指针分配空间,而不是为 5 个 struct trie 对象分配空间。 malloc(size * sizeof(struct trie)) 也是正确的,但您的 malloc(size * sizeof *mainTrie) 等效且更强大。
  • 还有stackoverflow.com/questions/20801582/… 和许多关于同一件事的许多其他问题。

标签: c malloc free


【解决方案1】:

向我们展示您的完整代码,特别是 maintree 结构。看来您需要释放 maintree 变量:

free(maintree);

但是,释放内存意味着您保留的内存将再次可供操作系统使用。这并不意味着您实际上将那块内存设置为 NULL。编辑:@MattMcNabb“通常内存不会释放给操作系统,只是可用于同一进程的进一步分配。(这当然取决于很多事情)”

可能您正在打印一块不再属于您的程序的内存,但数据尚未更改。

请注意documentation 中的这两个重要事项

  1. 先前通过调用 malloc、calloc 或 realloc 分配的内存块被释放,使其再次可用于进一步分配。(只是释放,没有说明正在更改的值)李>

如果 ptr 没有指向使用上述函数分配的内存块,则会导致未定义的行为。

如果 ptr 是空指针,函数什么也不做。

  1. 请注意,此函数不会更改 ptr 本身的值,因此它仍然指向相同(现在无效)的位置。(因此您可能指向您过去分配的一块内存,但是它仍然具有相同的值,有可能,它不会一直发生)。

【讨论】:

  • 通常内存不会释放给操作系统,只是可用于同一进程的进一步分配。 (这当然取决于很多事情)
  • 感谢@MattMcNabb 的更正!我同意你的看法。
  • 总是在你的答案中加入更正......仅仅将它们放在 cmets 中是不够的。
猜你喜欢
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
相关资源
最近更新 更多