我在C编程。我想知道我们应该遵循什么样的做法来避免内存泄漏 在发展本身。请注意特别注意的事项 处理字符串和动态内存分配。
答案 0 :(得分:9)
我不同意这个问题的低票。我认为这是一个真正的问题,而且非常深刻。
表面上,答案是“free
编辑的任何记忆中的malloc
。”
但真正的答案是您的设计应包含 clear 所有权模型。避免内存泄漏和访问悬空内存的唯一方法是总是知道,对于每一块动态分配的内存,哪个对象拥有该内存(并负责处理它)。
如果你没有这种明确的所有权模型,你将永远捕获内存泄漏和使用后免费的错误(这也适用于C ++)。使用垃圾收集器可以避免这些问题,但代价是CPU周期很长。
如果你确实有一个明确的所有权模型,这些问题通常会消失:所有者free
拥有它所拥有的所有内存。
答案 1 :(得分:6)
如果可能,请在堆栈上使用变量,而不是使用堆中的内存。
尽量避免常见错误,一些指示:
free()
或malloc()
时致电calloc()
。 free()
,即不丢失引用。 realloc()
时要小心。不要使用相同的指针输入&输出参数。 避免使用字符串发生的常见错误,一些指示:
NUL
字符的内存。 NUL
终止(即使在strncpy()
等函数中使用时也是如此。)学习使用调试器(gdb)
学习使用静态分析工具。可以从您的发行版软件包存储库中安装splint,valgrind,clang等工具。
几条有用的链接:
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
,您不应该打扰free
或GC_free
。 Boehm的GC工作在实践中表现良好(即使理论上泄漏的可能性很小)。
请注意,作为实时数据不是模块化属性:给定数据块在整个程序中是活动的(不在特定的给定模块中)。
要回答原始问题,一个重要的问题是定义分配策略并记录它。特别是,每个返回动态分配数据的函数都应该说明该数据应该由free
表示的方式和由谁{d}。
在Linux上使用C(或C ++)捕获内存泄漏错误的有用工具是valgrind。在开发代码时,不要忘记将-g -Wall
标记传递给gcc
和g++
。
答案 4 :(得分:0)
我不是C程序员,但通常你需要销毁或处理你不再使用的所有东西。
如果你没有处理对象,而字符串就是对象,那么内存可能不会被垃圾收集,并且可能会留在内存中。