【问题标题】:Freeing memory after use使用后释放内存
【发布时间】:2010-01-19 17:04:16
【问题描述】:

我有一个命令行 C 程序,我使用 calloc() 函数为一个结构分配一些内存,该结构中也有一个分配了一些内存的结构。

如果我使用 free() 函数从父结构中释放内存,它是否也会从子结构中释放内存?

或者我应该先从子结构中释放内存?

【问题讨论】:

  • 您是否也将 calloc/malloc 用于子结构?
  • 如果您在子结构上使用 calloc(),则必须在该内存上使用 free()。否则,随着您的程序运行,它将逐渐占用越来越多的内存。 (如果你的程序在退出之前没有做这么多,那并不是很重要,但如果你在循环中这样做,你甚至可能崩溃。)

标签: c memory-leaks memory-management free calloc


【解决方案1】:

这是一个简单的规则,对于你所做的每一次内存分配,你必须自己显式地释放内存。所以,你需要自己释放子内存。

【讨论】:

  • 并且您至少需要在释放父结构之前获取指向子内存的指针 - 以确保代码不会访问已释放的内存。或者,只需在父母之前释放子结构 - 这是对您拥有的任何树结构进行后序遍历的情况。
【解决方案2】:

不,你需要先释放孩子的记忆。

【讨论】:

    【解决方案3】:

    总是先释放子结构。编写将释放每种类型的结构以进一步简化生活的函数可能是明智的。如果 structTypeA 包含 structTypeB 和 StructTypeC,这将允许您简单地调用 freeStructTypeA(pointer-to-sTA-instance) 并让函数在释放 structTypeA 本身之前释放所有子结构。

    在相关说明中,您最好尝试通过 valgrind 运行代码,以确保正确释放所有内存。

    【讨论】:

    • 我完全同意。如果结构包含动态分配的子对象,通常最容易编写一个函数来处理释放结构和所有关联的子对象。
    【解决方案4】:

    这取决于释放后结构发生了什么。只要在free() 之后没有引用结构,一切都很好。如果 free 被调用,然后一些代码引用了释放的内存,则可能会发生非常难以调试的事情。不要做后者。

    【讨论】:

      【解决方案5】:

      可能根本不需要释放内存,因为所有分配的内存都会在程序终止时释放。如果你想节省内存使用,你只需要调用 free()。

      【讨论】:

      • 如果在循环中创建和删除父结构怎么办?
      【解决方案6】:

      我认为值得一提的是,对于短期运行的命令行工具,它通常并不重要。一旦你的程序运行完毕,操作系统无论如何都会回收所有的内存。但是,如果这是一个运行时间不确定的工具,您确实需要担心内存管理,其他答案有很好的建议。

      【讨论】:

      • 我认为说'让操作系统来处理它'是一个糟糕的建议,即使它是用于一个小程序。您不想养成编写泄漏代码的习惯。
      猜你喜欢
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      • 2018-05-18
      相关资源
      最近更新 更多