无法检测valgrind检测到的内存泄漏

时间:2011-01-28 22:39:26

标签: c++ valgrind

以下是我的程序中新/删除操作符的模式。 Valgrind说记忆“肯定会丢失”。我无法得到泄漏的地方。我使用new / delete运算符是否有问题。

 class Generic
 {
        GenericInterface *gInterface; //GenericInterface is abstract class

        public:
           Generic ()
           {
                gInterface = NULL;
           }
           ~Generic ()
           {
               delete gInterface;
           }
           void Create()
           {
           gInterface = new Specific();
           }
    };

    class Specific : public GenericInterface
    {
       MyClass* _myClass; 

    public:
      Specific()
      {
         _myClass = new MyClass;
      }

      ~Specific()
      {
         delete _myClass; 
      }

    };

    int main()
    {
       Generic g;
       g.Create();
    }

valgrind说记忆力已经消失。

==2639== 8 bytes in 1 blocks are definitely lost in loss record 2 of 45
==2639==    at 0x4026351: operator new(unsigned int) (vg_replace_malloc.c:255)
==2639==    by 0x804D77C: Specific::Specific() (Specific.cc:13)
==2639==    by 0x804DAFC: Generic::Create() (Generic.cc:58)

4 个答案:

答案 0 :(得分:11)

您没有关注rule of three。如果您的类管理需要清理的资源,则必须声明析构函数,复制构造函数和复制赋值运算符。您的类都没有复制构造函数或复制赋值运算符。

真的,你几乎可以肯定只是使用来自C ++ 0x的unique_ptr之类的智能指针;来自Boost,C ++ TR1和C ++ 0x的shared_ptr;或来自Boost的scoped_ptr

导致此特定问题的可能问题是您忘记创建基类GenericInterface析构函数virtual,因此正在调用错误的析构函数以及您的MyClass对象在Specific中动态创建永远不会被破坏。

如果没有声明基类析构函数delete,那么

{{1}通过指向其中一个基类的对象会导致未定义的行为(这意味着会发生不好的事情,从内存泄漏到崩溃)。

答案 1 :(得分:2)

您的GenericInterface析构函数可能不是虚拟的,因此在GenericInterface被销毁时只会调用gInterface析构函数。

答案 2 :(得分:0)

您的GenericInterface类是否声明了虚拟析构函数?如果没有,将不会调用Specific类的析构函数,因此不会执行“delete _myClass”行。

另一种方式C ++让你的生活变得更有趣:)

答案 3 :(得分:0)

在Generic类析构函数中,您还应该在删除之前检查gInterface指针。如果在销毁对象之前未调用Create(),则会导致问题。如果你的c ++编译器没有抛出新的失败,你的其他类也可能会做同样的事情