如何避免c开发过程中的内存泄漏

时间:2011-11-22 05:13:34

标签: c linux gcc memory-leaks

我在C编程。我想知道我们应该遵循什么样的做法来避免内存泄漏 在发展本身。请注意特别注意的事项 处理字符串和动态内存分配。

5 个答案:

答案 0 :(得分:9)

我不同意这个问题的低票。我认为这是一个真正的问题,而且非常深刻。

表面上,答案是“free编辑的任何记忆中的malloc。”

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

如果你没有这种明确的所有权模型,你将永远捕获内存泄漏和使用后免费的错误(这也适用于C ++)。使用垃圾收集器可以避免这些问题,但代价是CPU周期很长。

如果你确实有一个明确的所有权模型,这些问题通常会消失:所有者free拥有它所拥有的所有内存。

答案 1 :(得分:6)

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

尽量避免常见错误,一些指示:

  1. 确保在使用free()malloc()时致电calloc()
  2. 不指定指向已分配内存位置的指针而不首先free(),即不丢失引用。
  3. 使用realloc()时要小心。不要使用相同的指针输入&输出参数。
  4. 避免使用字符串发生的常见错误,一些指示:

    1. 确保有用于终止NUL字符的内存。
    2. 确保字符串在所有用例中都被NUL终止(即使在strncpy()等函数中使用时也是如此。)
    3. 学习使用调试器(gdb
      学习使用静态分析工具。可以从您的发行版软件包存储库中安装splintvalgrindclang等工具。

      几条有用的链接:
      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

      希望这有帮助!

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

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

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

要回答原始问题,一个重要的问题是定义分配策略并记录它。特别是,每个返回动态分配数据的函数都应该说明该数据应该由free表示的方式和由谁{d}。

附加物

在Linux上使用C(或C ++)捕获内存泄漏错误的有用工具是valgrind。在开发代码时,不要忘记将-g -Wall标记传递给gccg++

答案 4 :(得分:0)

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

如果你没有处理对象,而字符串就是对象,那么内存可能不会被垃圾收集,并且可能会留在内存中。