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関数自体がポインターの所有権を取得し、再割り当てが失敗した場合は、ポインターを削除する責任を負います。

を受け取る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_ptrs を別の場所に格納することはできますが、auto_ptr のコピー セマンティクスは、コピーに依存する STL コンテナーとは調和しません。

于 2010-08-08T00:38:06.337 に答える