1

编辑:我应该提到,我正在查看Boost 的文档ptr_sequence_adapter,它声称他们的适配器template< class U > void push_back( ::std::auto_ptr<U> x );等同于做vec.push_back(autoPtr.release());,并且还提供了强大的异常保证。然后我意识到我混淆了他们对实施效果的描述与实施的实际情况,所以这个问题是半荒谬的。我只是把它留在这里留给后代。

对我来说,似乎调用std::auto_ptr<t>会成功,然后调用std::vector<t*>::push_back可能会引发异常,并且指针会被泄露。

看来您必须这样做:

vec.push_back(0); //Attempts to allocate space in vector, could throw bad_alloc
vec.back() = autoPtr.release(); //Provides nothrow
4

2 回答 2

1

这特别是 Boost 指针容器库的一个特性。

push_back成员函数定义为:

void push_back( value_type x )  // strong               
{
    this->enforce_null_policy( x, "Null pointer in 'push_back()'" );

    auto_type ptr( x );           // notrow
    this->base().push_back( x );  // strong, commit
    ptr.release();                // nothrow
}

(来自ptr_sequence_adapter.hpp 标头

因此,push_back函数本身拥有指针的所有权,如果重新分配失败,它负责删除指针。

接受 an的push_back重载auto_ptr是根据基push_back函数定义的:

template< class U >
void push_back( std::auto_ptr<U> x )
{
    push_back( x.release() );
}

指针在调用 base 之前被释放push_back,这没关系,因为 basepush_back函数有很强的保证,如果抛出异常,它将删除指针。

于 2010-08-08T00:41:46.390 回答
0

将对象从 auto_ptr 中传输出来会释放 auto_ptr 对该对象的控制。它不再获得 auto_ptr 的好处。您必须将该对象放在另一个智能指针中才能再次成为异常安全的,或者是一个提供异常安全保证的容器对象(如果有的话?)。

请注意 std::auto_ptr 不能直接在 STL 容器中使用。例如, std::vector<auto_ptr<int>> 将中断。您可以拥有指向 auto_ptrs 的指针,并将 auto_ptr 存储在其他地方,但 auto_ptr 复制语义与依赖复制的 STL 容器不兼容。

于 2010-08-08T00:38:06.337 回答