【问题标题】:Is it safe to initialize an auto_ptr with a pointer to a derived class?使用指向派生类的指针初始化 auto_ptr 是否安全?
【发布时间】:2013-12-11 00:16:56
【问题描述】:

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

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


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

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

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

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

【问题讨论】:

  • 那个问题不依赖于auto_ptr,是吗?它适用于所有指针。如果你不能做到这一点,你就不能在 C++ 中拥有多态性,这将是可悲的。
  • @PeterSchneider 这个问题是针对 auto_ptr 的。主要是我想确定它的implementation didn't slice the object passed in,但我也想学习像虚拟析构函数那样的陷阱。

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


【解决方案1】:

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

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

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

【讨论】:

  • 请注意,在基类没有虚拟析构函数的情况下,使用基类指针删除对象是未定义的行为。一种可能的结果是内存泄漏,但任何事情都是允许的,因此情况可能会更糟。例如,在存在多重继承的情况下,内存分配器使用的数据结构可能会崩溃或损坏。
  • 谢谢,已将其添加到我的回答中。
【解决方案2】:

绝对安全。

有许多参考资料可用 - 尝试搜索“auto_ptr polymorphism”。

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

【讨论】:

    【解决方案3】:

    只要你的类Basestd::auto_ptr&lt;Base&gt;被参数化为有一个virtual析构函数,你就可以用派生自Base的类初始化std::auto_ptr&lt;Base&gt;,如果std::auto_ptr&lt;Base&gt;析构函数它们将被正确销毁当Base 的定义可见时实例化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      相关资源
      最近更新 更多