有没有理由使用auto_ptr?

时间:2010-12-29 12:40:02

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

从他的STL书中读到Jossutis对auto_ptr的解释之后,我得到了一个强烈的印象,即我试图使用它的任何任务都会100%失败,因为很多auto_ptr的陷阱之一。

我的问题是:是否有任何真实生活任务,其中auto_ptr确实很有用并且适合那里?

4 个答案:

答案 0 :(得分:14)

显然,auto_ptrunique_ptr失败。

现在,在'严格的C ++ 03无提升'世界中,我经常使用auto_ptr,最值得注意的是:

  • 对于返回给定类型的动态分配实例的“工厂成员函数”:我喜欢在返回类型中使用std::auto_ptr的事实表明对象必须被删除< / LI>
  • 在尝试将对象插入容器之前分配对象的函数中:例如,仅当release()返回该插入成功时才{@ 1}}
  • 在从消息队列中弹出元素的线程过程中,我喜欢将pop'ed元素存储在std::map<>::insert中,以明确消息将被销毁,无论如何

答案 1 :(得分:5)

我想说它可以使用,但它不是最好的选择。

首先,这是一年或更短的时间,auto_ptr正式弃用。其次,有一个更好的选择:unique_ptrDr. Stroustrup once said关于unique_ptr

  

“auto_ptr应该是什么”(但是   我们无法用C ++编写98)

因此,除非您没有选择,auto_ptr不是一个好选择。主要是因为现在大多数C ++编译器都实现move semantics并提供unique_ptr

答案 2 :(得分:2)

在简单的场景中,当您需要临时控制堆分配的对象auto_ptr时可以毫无问题地使用。例如,如果您需要有条件地创建一个仅在一个函数中使用的对象,则无法在堆栈上分配它,auto_ptr可以让您在发生异常时不关心对象的生命周期。

答案 3 :(得分:1)

我经常适度使用std::auto_ptr,以确保异常安全。也就是说,为了防止在部分方法抛出异常的情况下发生内存泄漏。

例如:

Foo &Container::addFoo(
   const std::string &name
   )
{
  // The post conditions of the method require that the new Foo
  // has been added to this container, but the addition method
  // may throw exceptiona
  std::auto_ptr< Foo > foo(new Foo(name));

  foo->twiddle();// may throw
  this->addFoo(*foo);// record reference. May throw

  return *foo.release();
}

编辑: 澄清this->addFoo(*foo)记录了参考文献。