威's profile我只是风的影子,根本不存在的东西PhotosBlogLists Tools Help

Blog


    08 June

    C++中的内存泄露问题

        最近几天都在解决一个daemon的内存泄露问题,是用来做信息过滤的,并且是多线程的。
    刚刚写完这个程序的时候就发现有内存泄露,平均1000次处理信息后会泄露502K,很严重。
    之前我曾经做过一些C程序的内存泄露的检查,C的比较好办一些,只要有内存泄露肯定是
    有malloc而没有对应的free, 而由于C++语言本身的复杂性,它的内存泄露检测就没有这么简单了。
    比如下面这种情况:
    char  *test = new char[10];
    delete test;
    确实是用了delete的,但是写错了,应该是 delete []test 才正确。
    还有以下的情况:
    #include <iostream>
    #include <string>
    using namespace std;
    class VBase
    {
    public:
        virtual ~VBase(){}  // 如果没有这行,就不能释放Test中分配的内存
        virtual void test() = 0;
    };
    class Test : public VBase
    {
    public:
        Test(){}
        ~Test(){}
        virtual void test(){}
    };

    int main()
    {
        VBase    *vb;
        Test    *test = new Test();
        vb = test;
        delete vb;
        return 0;
    }
    子类Test被分配了内存空间,可是释放的时候是从父类VBase的指针释放的,这种情况,
    如果父类的析构函数不是虚函数,就不会调用子类的析构函数(即使父类是抽象类也是如此!),
    从而导致子类中分配的内存不能释放。
    对C++语言的掌握不仅仅是能写出可以正确运行的程序来!
    能写出稳定、高效、灵活且没有内存泄露的程序来的才算C++用的好。