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

标签 c++ boost auto-ptr exception-safe

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

相关文章:

C++ 是否使用 auto_ptr 引用作为输出变量惯用?

c++ - 如何产生随机数,使它们的总和等于给定的数字?

c++ - 静态变量被初始化两次

c++ - 当存在调试代码时如何禁止 git 提交

c++ - 振奋 spirit : What type names should be used for the built in terminals?

c++ - 模板成员转换运算符编译错误

c++ - 为什么我的 C 程序可以从 C++ 文件调用函数而不包含 header ?

c++ - 是大括号可构造的类型特征

c++ - 通过索引运算符插入到 boost::program_options::variables_map

c++ - 在 C++ 中将 auto_ptr 与引用结合起来