从他的STL书中读到Jossutis对auto_ptr的解释之后,我得到了一个强烈的印象,即我试图使用它的任何任务都会100%失败,因为很多auto_ptr的陷阱之一。
我的问题是:是否有任何真实生活任务,其中auto_ptr确实很有用并且适合那里?
答案 0 :(得分:14)
显然,auto_ptr
对unique_ptr
失败。
现在,在'严格的C ++ 03无提升'世界中,我经常使用auto_ptr
,最值得注意的是:
std::auto_ptr
的事实表明对象必须被删除< / LI>
release()
返回该插入成功时才{@ 1}} std::map<>::insert
中,以明确消息将被销毁,无论如何答案 1 :(得分:5)
我想说它可以使用,但它不是最好的选择。
首先,这是一年或更短的时间,auto_ptr
正式弃用。其次,有一个更好的选择:unique_ptr
。 Dr. 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)
记录了参考文献。