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

Ank*_*kur 11 c c++ memory memory-leaks

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

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

fma*_*ark 10

这有三种主要方式.

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

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

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


Sec*_*ure 7

对于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
}
Run Code Online (Sandbox Code Playgroud)

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