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

Is it safe to initialize an auto_ptr with a pointer to a derived class?

本文关键字:auto ptr 是否 安全 初始化 指针 派生      更新时间:2023-10-16

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

class Base
{
    public:
        virtual ~Base() {}
        virtual void DoSomething() = 0;
};

class Child : public Base
{
    public:
        virtual void DoSomething()
        {
            // Do Something
        }
};

用指向派生类实例的指针初始化基类类型的std::auto_ptr是否安全?也就是说,一个像这样创建的对象:

std::auto_ptr<Base> myObject(new Derived());

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

尽管自C++11问世以来,您不应该再使用std::auto_ptr

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

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

完全安全。

许多参考文献都可用——请尝试搜索"auto_ptr多态性"。

例如。http://www.devx.com/tips/Tip/14391

只要您的类Basestd::auto_ptr<Base>被参数化为具有virtual析构函数,您就可以用从Base派生的类初始化std::auto_ptr<Base>,并且如果std::auto_ptr<Base>析构函数在Base的定义可见时被实例化,则它们将被正确地销毁。