有哪些提示可以帮助我避免应用程序中的内存泄漏?在我的当前项目中,我使用一种名为"INSURE++"的工具来查找内存泄漏并生成报告。
除了使用这种工具外,还有哪些方法可以识别内存泄漏并解决它?
有哪些提示可以帮助我避免应用程序中的内存泄漏?在我的当前项目中,我使用一种名为"INSURE++"的工具来查找内存泄漏并生成报告。
除了使用这种工具外,还有哪些方法可以识别内存泄漏并解决它?
有三种主要方法可以做到这一点。
第一种方法是从一开始就不要创建内存泄漏。在这里防御性编程技术非常有价值。参见这篇优秀的演示文稿以概述此问题,或者参见Secure C编码中的相关章节。我更熟悉C而不是C++,但我了解到C++的智能指针在这方面很有用。
第二种方法是进行静态分析,试图检测源代码中的错误。最初属于此类别的工具是lint,但现在已经过时了。据我所知,最好的工具是商业工具,如Coverity。然而,一些免费的工具存在。
第三种方法是在运行时检测内存泄漏,就像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
}
mymem_alloc
函数执行错误检查,那么传递错误字符串吗?调用者是否仍然需要在继续之前检查mymem_alloc
的返回值?您如何处理这种情况?有没有在线上可以查看的示例代码?(这些模板式的内容正是我目前遇到的大部分问题...) - James Morrishttp://www.cprogramming.com/tutorial/memory_debugging_parallel_inspector.html
http://scottmcpeak.com/memory-errors/
http://www.yolinux.com/TUTORIALS/C++MemoryCorruptionAndMemoryLeaks.html
http://ootips.org/yonat/4dev/smart-pointers.html
在可能的情况下,应该在相关作用域内使用栈分配的对象,而不是使用new/delete。使用智能指针,例如 std::shared_ptr<t>
(C++0x),std::tr1::shared_ptr<t>
(TR1),或者 boost::shared_ptr<t>
。当然,这个解决方案只适用于 C++ -- 在 C 中你需要自己解决。