在阅读了 Jossutis 从他的 STL 书中对 auto_ptr 的解释后,我有一个强烈的印象,即无论我尝试在什么任务中使用它,我都会 100% 失败,因为 auto_ptr 的许多陷阱之一。
我的问题是:是否有任何现实生活中的任务 auto_ptr 非常有用并且非常适合那里?
在阅读了 Jossutis 从他的 STL 书中对 auto_ptr 的解释后,我有一个强烈的印象,即无论我尝试在什么任务中使用它,我都会 100% 失败,因为 auto_ptr 的许多陷阱之一。
我的问题是:是否有任何现实生活中的任务 auto_ptr 非常有用并且非常适合那里?
显然,auto_ptr
输给unique_ptr
。
现在,在“没有提升的严格 C++03”世界中,我auto_ptr
经常使用,最值得注意的是:
std::auto_ptr
对象的事实release()
仅当std::map<>::insert
返回该插入成功时const std::auto_ptr
中,以明确消息无论如何都会被销毁。我会说它可以使用,但它不是最好的选择。
首先,它是一年或更短时间的问题,并且auto_ptr
已被正式弃用。其次,还有一个更优越的选择:unique_ptr
. Stroustrup 博士曾经说过unique_ptr
:
“auto_ptr 应该是什么”(但我们不能用 C++98 编写)
所以除非你别无选择,否则auto_ptr
不是一个好的选择。主要是因为现在大多数 C++ 编译器都实现move semantics
并提供unique_ptr
.
在简单的场景中,当您需要临时控制堆分配的对象auto_ptr
时,可以毫无问题地使用。例如,如果您需要有条件地创建一个仅在一个函数中使用的对象,则您不能在堆栈上分配它,并且auto_ptr
如果发生异常,您无需关心对象的生命周期。
我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)
记录参考。