什么是auto_ptr& amp;的unique_ptr?

时间:2014-04-27 15:11:17

标签: c++ c++11 stl

我无法理解unique_ptr或auto_ptr的含义,众所周知,一旦参数超出其范围,我们就不会得到内存泄漏。但是,如果我在堆栈上而不是在堆上创建参数,这是一个更好的主意。我没有看到它优于正常参数的优势。如果我们真的需要在堆上创建参数,那么我们必须使用new运算符,对吗?

这是一个小代码片段:

class Base
{
public:
    Base()
    {
        cout << "Base::()" << endl;
    }
    virtual ~Base()
    {
        cout << "~Base()" << endl;
    }

    virtual void iPhone()
    {
        cout << "I'm iPhone5s" << endl;
    }
};

class Derive : public Base
{
public:

    Derive()
    {
        cout << "Derive()" << endl;
    }

    virtual void iPhone()
    {
        cout << "I'm iPhone 6" << endl;
    }

    virtual ~Derive()
    {
        cout << "~Derive()" << endl;
    }
};

void main()
{
  {

      auto_ptr<Base> ptr(new Derive());//a foolish idea to do so?
      ptr->iPhone();

      Derive d;//isn't it better?
      Base* base = &d;
      base->iPhone();
 }
}

4 个答案:

答案 0 :(得分:3)

以所有权形式而不是指针来查看std::unique_ptrstd::shared_ptr会有所帮助:std::unique_ptr当某些东西一次只能拥有一个所有者时,{{1什么时候可以分享。

请注意,由于C ++ 11(引入了其他智能指针)std::auto_ptr已被弃用。

答案 1 :(得分:2)

我在回答评论中的问题而不是标题中获得了大量的投票。在评论中,您问However, is it a better idea if I create the parameter on the stack rather on the heap.这是该问题的答案:

应始终首选自动变量,但它有限制。您可能希望动态分配仅持续范围的内存的原因是,当您要创建大型内存时,堆栈的大小有限,因此如果可能超出该大小,您可能希望在堆上创建它。

答案 2 :(得分:0)

忘记auto_ptr。它现在已经过时了,因为它具有不同寻常的复制语义。如果您想拥有真实smart pointers,请使用unique_ptrshared_ptr

现在,您的问题是:为什么要使用unique_ptr?在对象A中创建对象B时,可以将其声明为B类的属性。它在堆栈中,你不需要unique_ptr。确实如此,但有时候,您的对象B必须初始化而不 A的实例,因为例如A太大,或者您不要使用它。因此,您必须进行动态分配,并且有助于使用unique_ptr来避免指向delete

答案 3 :(得分:0)

Consider you have:

class A { };
class B : public A { };

A* factory(bool willBeA)
{
  return willBeA ? new A() : new B();
}

int main()
{
  //I want to get an instance of A or maybe B depending on a value
  bool val = false;
  unique_ptr<A> ptr { factory(val) }; //you need having a pointer to the returned value of A

  //do something

  //no need for delete

  return 0;
}

在这种情况下,您无法创建自动变量来存储A,因为您实际上不知道是否将使用A或B的实例。