以下是我的程序中新/删除操作符的模式。 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)
答案 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 ++编译器没有抛出新的失败,你的其他类也可能会做同样的事情