【问题标题】:How to avoid memory leak during development in cc语言开发时如何避免内存泄漏
【发布时间】:2011-11-22 05:13:33
【问题描述】:

我是用 C 编程的。我想知道我们应该遵循什么做法来避免内存泄漏 在开发本身的时候。请提及在使用过程中需要特别注意的事项 处理字符串和动态内存分配。

【问题讨论】:

  • 问题是这个问题需要一本书来回答。为什么不告诉我们您遇到了什么问题,我们可以提供帮助?What have you tried?
  • 简单。 非常小心。这应该避免任何内存泄漏。

标签: c linux gcc memory-leaks


【解决方案1】:

我不同意对这个问题投反对票。我认为这是一个真正的问题,而且相当深刻。

从表面上看,答案是“在您malloced 的任何记忆上致电free”。

但真正的答案是您的设计应该包含一个明确的所有权模型。避免内存泄漏和访问悬空内存的唯一方法是始终知道,对于每一块动态分配的内存,哪个对象拥有该内存(并负责处置它)。

如果您没有如此清晰的所有权模型,您将永远寻找内存泄漏和释放后使用错误(这也适用于 C++)。使用垃圾收集器可以让您解决这些问题,但代价是大量的 CPU 周期。

如果你有一个明确的所有权模型,这些问题通常就会消失:所有者frees 在它自己被处置时拥有的所有内存。

【讨论】:

    【解决方案2】:

    尽可能在堆栈上使用变量,而不是使用堆中的内存。

    尽量避免常见错误,几点指点:

    1. 使用malloc()calloc() 时请务必致电free()
    2. 不要在没有free()ing 的情况下重新分配指向已分配内存位置的指针,即不要丢失引用。
    3. 使用realloc() 时要小心。不要对输入和输出参数使用相同的指针。

    避免使用字符串的常见错误,一些指针:

    1. 确保有用于终止NUL 字符的内存。
    2. 确保 string 在所有用例中都以 NUL 终止(即使在 strncpy() 等函数中使用时也是如此)

    学习使用调试器 (gdb)
    学习使用静态分析工具。像splintvalgrindclang 这样的工具可以从你的发行版的包存储库中安装到你的 Linux 系统上。

    几个有用的链接:
    c-faq - Arrays & Pointers
    c-faq - Memory allocation
    Secure C Coding - Memory Management
    SO Question related to avoiding memory leak in C/C++
    yolinux tutorial

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      避免内存泄漏的唯一方法是在代码的生命周期内手动free() 分配您分配的所有内存。

      您可以使用valgrind 等工具来检查内存泄漏。它将显示程序终止时未释放的所有内存。

      【讨论】:

      • 嗯,通常情况下,Valgrind 会显示大部分未释放的内存。 (至少,如果您计算无法访问的内存。)
      【解决方案4】:

      在 C 中可以进行垃圾收集,尤其是使用 Boehm's conservative GC。要使用它,请在您的所有程序中将malloc 替换为GC_malloc,将strdup 替换为GC_strdup,并且您不应该打扰调用freeGC_free。 Boehm 的 GC 在实践中工作得非常好(即使理论上泄漏的可能性很小)。

      请注意,作为实时数据不是模块化属性:给定数据块在整个程序中是活跃的(而不是在特定的给定模块中)。

      要回答最初的问题,一个重要的问题是定义分配策略并记录它。特别是,每个返回动态分配数据的函数都应说明该数据应该如何以及由谁提供free-d。

      附录

      valgrind 是在 Linux 上寻找 C(或 C++)中的内存泄漏错误的有用工具。开发代码时不要忘记将-g -Wallflags 传递给gccg++

      【讨论】:

        【解决方案5】:

        我不是 C 程序员,但通常你需要销毁或处置你不再使用的所有东西。

        如果你不处理对象,而字符串是对象,那么内存可能不会被垃圾回收,可能会一直驻留在内存中。

        【讨论】:

        • c 中没有垃圾回收,除非你自己实现。
        • 对,所以一个更有说服力的论点来处理不再需要的所有东西
        猜你喜欢
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 2020-05-13
        • 1970-01-01
        • 2018-04-08
        • 2013-06-24
        相关资源
        最近更新 更多