使用指向派生类的指针初始化auto_ptr是否安全?

时间:2013-12-11 00:16:56

标签: c++ smart-pointers auto-ptr

假设我有一个基类和一个派生类:

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());

正确调用派生类的析构函数而不是基类而不泄漏内存?

3 个答案:

答案 0 :(得分:5)

尽管自C ++ 11到来以来你不应该再使用std::auto_ptr;

是的,这是安全的,只要您的基地有虚拟析构函数

如果没有基础上的虚拟析构函数(如下面提到的Steve Jessop),您将得到未定义的行为,因为派生类的析构函数在销毁时是未知的,因此不会被执行。这是一个危险的问题,因为在许多情况下它不会被注意到。例如,如果您要在单继承类中管理某种资源,应该在析构函数中释放,则会以静默方式发生泄漏。

答案 1 :(得分:1)

完全安全。

许多参考资料都可用 - 尝试搜索&#34; auto_ptr polymorphism&#34;。

e.g。 http://www.devx.com/tips/Tip/14391

答案 2 :(得分:0)

只要您的Basestd::auto_ptr<Base>参数化了virtual析构函数,您就可以使用std::auto_ptr<Base>派生的类初始化Base如果在std::auto_ptr<Base>的定义可见时实例化Base析构函数,将被正确销毁。