我在C编程。我想知道我们应该遵循什么样的做法,以避免在开发本身时发生内存泄漏。 处理string和dynamic内存分配时请特别提及要采取的注意事项。
如果可能的话,在堆栈上使用变量,而不是从堆中使用内存。
尽量避免常见的错误,几点提示:
malloc()
或calloc()
时调用free()
calloc()
。 free()
分配内存位置的指针,即不要丢失引用。 realloc()
时要小心。 输入输出参数不要使用相同的指针。 避免使用字符串所犯的常见错误,几点提示:
NUL
字符的内存。 NUL
终止的(即使用在像strncpy()
等函数中) 学习使用调试器( gdb )
学习使用静态分析工具。 像splint , valgrind , clang这样的工具可以从你的发行版的软件包库中安装到你的linux系统上。
很少有用的链接:
c-faq – 数组和指针
c-faq – 内存分配
安全C编码 – 内存管理
SO有关在C / C ++中避免内存泄漏的问题
yolinux教程
希望这可以帮助!
我不同意这个问题的反对票。 我认为这是一个真正的问题,而且相当深入。
从表面上看,答案是“任何你记忆的内存上都可以free
调用”。
但真正的答案是,你的设计应该包括一个明确的所有权模式。 避免内存泄漏和访问悬空内存的唯一方法是,对于每一块动态分配的内存, 总是知道哪个对象拥有该内存(并负责处理内存)。
如果你没有这样一个清晰的所有权模型,你将永远追捕内存泄漏和使用后的免费错误(这也适用于C ++)。 垃圾收集器的使用将允许你花费大量的CPU周期来解决这些问题。
如果确实拥有清晰的所有权模式,这些问题通常会消失:所有者在处置本身时会free
所拥有的全部内存。
避免内存泄漏的唯一方法是在代码的生命周期中手动free()
您所分配的所有内存。
您可以使用诸如valgrind
工具来检查内存泄漏。 它会显示在程序结束时没有被释放的所有内存。
C中有垃圾收集的可能性,特别是使用Boehm的保守GC 。 要使用它,用GC_malloc
替换malloc
,在所有程序中用GC_strdup
替换strdup
,不要打扰调用free
或GC_free
。 Boehm的GC工作在实践中很好(即使理论上泄漏的可能性很小)。
请注意,作为实时数据不是一个模块化属性:给定的数据块在整个程序中(不在特定的给定模块中)存在。
要回答最初的问题,一个重要的问题是定义一个分配策略,并将其记录下来。 特别是,每个返回动态分配数据的函数应该说明数据如何以及由谁分配。
在Linux上的C(或C ++)中寻找内存泄漏错误的有用工具是valgrind 。 开发代码时不要忘记将-g -Wall
标志传递给gcc
和g++
。
我不是C程序员,但通常你需要销毁或处理你不再使用的所有东西。
如果你不处理对象,而字符串是对象,那么内存可能不会被垃圾收集,并可能留在内存中。