如何避免C / C ++中的内存泄漏

我可以使用哪些提示来避免应用程序中的内存泄漏? 在我当前的项目中,我使用了一个工具“INSURE ++”,它找到内存泄漏并生成报告。

除了该工具之外,还有任何方法可以识别内存泄漏并克服它。

这有三种主要方式。

首先是首先创建内存泄漏 。 防御性编程技术在这里非常宝贵。 有关此问题的摘要或安全C编码的相关章节,请参阅此优秀演示文稿 。 我对C语言比C ++更熟悉,但我知道C ++的智能指针在这里很有用。

第二种方法静态分析 ,它试图检测源代码中的错误。 这个类别中的原始工具是lint ,现在已经过时了。 据我所知,最好的工具是商业性的,例如coverty 。 但是, 确实存在一些免费工具 。

第三种方法是在运行时检测内存泄漏,就像INSURE ++那样。 Valgrind非常出色,值得推荐。 它可能有助于捕获您已经介绍过的错误。 如果您拥有一个具有良好代码覆盖率的测试套件,这将特别有用。

对于C,一个好的代码组织会有所帮助。 即不要在整个代码库中调用malloc()和free()。 将它们集中到两个函数中,然后您有一个单点用于所有检查。 最简单的可能是计算成功的呼叫并在程序退出时检查它们是否平衡。

static unsigned long mymem_count_alloc = 0; static unsigned long mymem_count_free = 0; void *mymem_alloc (size_t size) { void *p; p = malloc(size); if (p) { mymem_count_alloc++; } else error logging/handling/signaling return (p); } void mymem_free (void *p) { if (p) { free(p); mymem_count_free++; } } void mymem_check (void) { if (mymem_count_alloc != mymem_count_free) error alert } 

您可以继续使用不同的数据结构。 无论您需要为字符串分配内存,请使用mystr_alloc和mystr_free。 等等。 当以这种方式检测到泄漏时,您可以快速缩小范围。

智能指针在自动记录对象生命周期方面非常有用:

http://ootips.org/yonat/4dev/smart-pointers.html

在可能的情况下,在其相关范围内使用堆栈分配的对象而不是new / delete。

像valgrind这样的工具有一些开销,可能会减慢你的运行速度。 如果您知道您的代码库以及可能出现的泄漏类型,您可以定位特定的类并实现更轻的权重检查(即使只是一个简单的对象计数,您在退出时检查为零)。 然后,可以使用这些轻量级检查来激励您在触发时进行更广泛的valgrind调试会话。

我们是在讨论找到泄漏的工具,还是编写代码以避免泄漏的方法?

对于前者,上面提到的valgrind,或者IBM工具的Rational套件,如果你有许可证。 Dobbs博士推荐了CompuWare的BoundsChecker,但那是2002年。

对于后者,请参阅:

C ++成语避免内存泄漏?

http://www.cprogramming.com/tutorial/memory_debugging_parallel_inspector.html

http://scottmcpeak.com/memory-errors/

http://www.yolinux.com/TUTORIALS/C++MemoryCorruptionAndMemoryLeaks.html

使用智能指针,例如std::shared_ptr (C ++ 0x), std::tr1::shared_ptr (TR1)或boost::shared_ptr 。 当然这个解决方案只适用于C ++ – 你自己在C中。

避免或检测? 为了避免,首先检测并尝试了解何处和原因……另一种方法可能是使用GC库,如此处所述 ,但可能存在其他(可能更好)的库。