c++内存泄露排查思路

来源:互联网 发布:菲律宾网络博客靠谱吗 编辑:程序博客网 时间:2024/06/04 18:03

闲话少说,切入正题,本人在参与一个大型Win32软件项目时,对整个项目进行了内存泄漏方面的检查,随着泄漏代码的一个个发现,发现许多的泄漏都具有某些共同性,于是乎总结了一些常见泄漏代码,发给同事们看了。希望能提醒下大家,但后来在项目的二期、三期版本出现的泄漏发现和以前的一些问题几乎是同一性质的,回过来看以前写的一些笔记发现都概括了(当时觉得自己是有那么两把刷子,^_^)。于是想到也许很多编程同志也会碰到同样的问题,能写下来放到网上起到抛砖引玉的作用就更好了。

这里总结下检测出来的内存泄漏有共性的问题,希望对大家以后编程避免内存泄漏有所帮助:

  1. 类内成员动态分配
    类所有动态分配的成员变量,一定记得在析构函数中全部进行判断释放内存。当类中有指针成员变量,很多人喜欢在构造函数中来动态分配初始化指针变量但常常忘了在析构函数中来释放内存。当你初来人世,父母疼爱你,当你有了自己的小孩,你又有了生活的重心,此时父母已经被你遗忘了,当你的小孩又有了自己的小孩,你也就被遗忘了。我们很多程序员同志也是这样的,使用时我要用,new得挺爽的,用完不管我事了,这明显是违反我党一贯有始有终的原则的。
    示例代码:
    class CApple
    {
    public:
    CApple()
    {
    m_ptrData = new char[128];
    }

~CApple()
{
}
}
上面的m_ptrData指向的内存就这样泄漏掉了,记得在析构函数中加上释放的代码,改为如下:
~CApple()
{
if(NULL != m_ptrData)
{
delete m_ptrData;
m_ptrData = NULL;
}
}
需要提醒的是:上面删除m_ptrData再置NULL,是一个良好的编程习惯,可以避免产生野指针。(当然这里对象都析构了不存在这个问题,但其它很多地方将删除的指针置NULL是非常明智的一个做法,不然鬼知道这个指针指向的内存是否是有效的)

  1. 指针容器
    std::vector这个错误也是同志们经常犯的,其实很多时候若是简单结构、简单类,你直接用std::vector就好了,能不用std::vector

原创粉丝点击