gpt4 book ai didi

c++ - `myvector.push_back(autoPtr.release())`为什么提供强异常安全保障?

转载 作者:太空宇宙 更新时间:2023-11-04 12:24:01 24 4
gpt4 key购买 nike

编辑:我应该提到,我正在查看 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_ptrpush_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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com