15

在阅读了 Jossutis 从他的 STL 书中对 auto_ptr 的解释后,我有一个强烈的印象,即无论我尝试在什么任务中使用它,我都会 100% 失败,因为 auto_ptr 的许多陷阱之一。

我的问题是:是否有任何现实生活中的任务 auto_ptr 非常有用并且非常适合那里?

4

4 回答 4

14

显然,auto_ptr输给unique_ptr

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

  • 对于返回给定类型的动态分配实例的“工厂成员函数”:我喜欢在返回类型中使用明确必须删除std::auto_ptr对象的事实
  • 在随后尝试将对象插入容器之前分配对象的函数中:例如,release()仅当std::map<>::insert返回该插入成功时
  • 在从消息队列中弹出元素的线程过程中,我喜欢将弹出的元素存储在 aconst std::auto_ptr中,以明确消息无论如何都会被销毁。
于 2010-12-29T12:55:53.237 回答
5

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

首先,它是一年或更短时间的问题,并且auto_ptr已被正式弃用。其次,还有一个更优越的选择:unique_ptr. Stroustrup 博士曾经说过unique_ptr

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

所以除非你别无选择,否则auto_ptr不是一个好的选择。主要是因为现在大多数 C++ 编译器都实现move semantics并提供unique_ptr.

于 2010-12-29T12:45:21.510 回答
2

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

于 2010-12-29T12:43:13.703 回答
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)记录参考。

于 2010-12-29T12:52:39.153 回答