假设我有一个基类和一个派生类:
class Base
{
public:
virtual ~Base() {}
virtual void DoSomething() = 0;
};
class Child : public Base
{
public:
virtual void DoSomething()
{
// Do Something
}
};
使用指向派生类实例的指针初始化基类类型的std :: auto_ptr是否安全? I.E.会像这样创建一个对象:
std::auto_ptr<Base> myObject(new Derived());
正确调用派生类的析构函数而不是基类而不泄漏内存?
答案 0 :(得分:5)
尽管自C ++ 11到来以来你不应该再使用std::auto_ptr
;
是的,这是安全的,只要您的基地有虚拟析构函数。
如果没有基础上的虚拟析构函数(如下面提到的Steve Jessop),您将得到未定义的行为,因为派生类的析构函数在销毁时是未知的,因此不会被执行。这是一个危险的问题,因为在许多情况下它不会被注意到。例如,如果您要在单继承类中管理某种资源,应该在析构函数中释放,则会以静默方式发生泄漏。
答案 1 :(得分:1)
答案 2 :(得分:0)
只要您的Base
类std::auto_ptr<Base>
参数化了virtual
析构函数,您就可以使用std::auto_ptr<Base>
派生的类初始化Base
如果在std::auto_ptr<Base>
的定义可见时实例化Base
析构函数,将被正确销毁。