编辑:我应该提到,我正在查看 documentation for Boost's 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
最佳答案
这是 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 header)
因此,push_back
函数本身拥有指针的所有权,如果重新分配失败,它会负责删除指针。
采用 auto_ptr
的 push_back
重载是根据基本 push_back
函数定义的:
template< class U >
void push_back( std::auto_ptr<U> x )
{
push_back( x.release() );
}
指针在调用基础push_back
之前被释放,这是可以的,因为基础push_back
函数有很强的保证,如果发生异常,它会删除指针被抛出。
关于c++ - `myvector.push_back(autoPtr.release())`为什么提供强异常安全保障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3432609/