3

ここで std::auto_ptr<>::operator= について読みました

ただし、左側のオブジェクトが既に何らかのオブジェクトを指している場合、そのオブジェクトの割り当ては自動的に解除されないことに注意してください。これを明示的に行うには、新しい値を割り当てる前にメンバー関数 reset を呼び出します。

しかし、ヘッダーファイルのソースコードを読むとC:\Program Files\Microsoft Visual Studio 8\VC\ce\include\memory

template<class _Other>
    auto_ptr<_Ty>& operator=(auto_ptr<_Other>& _Right) _THROW0()
    { // assign compatible _Right (assume pointer)
    reset(_Right.release());
    return (*this);
    }

auto_ptr<_Ty>& operator=(auto_ptr<_Ty>& _Right) _THROW0()
    { // assign compatible _Right (assume pointer)
    reset(_Right.release());
    return (*this);
    }

auto_ptr<_Ty>& operator=(auto_ptr_ref<_Ty> _Right) _THROW0()
    { // assign compatible _Right._Ref (assume pointer)
    _Ty **_Pptr = (_Ty **)_Right._Ref;
    _Ty *_Ptr = *_Pptr;
    *_Pptr = 0; // release old
    reset(_Ptr); // set new
    return (*this);
    }

正しい/標準的な動作は何ですか? 他の STL 実装はどのように動作しますか? 上記の Web サイトに間違った情報や古い情報が含まれている場合、参考としてどの Web サイトをお勧めしますか?

4

1 に答える 1

6

割り当てられている が既にポインターを保持している場合はauto_ptr、そのポインターを最初に削除する必要があります。

2003 年の標準から (§20.4.5.1):

auto_ptr& operator=(auto_ptr& a) throw();

7 必須: 式delete get()は整形式です。

8 効果: reset(a.release())

9 戻り値: *this.

したがって、 への代入は、右側からポインタを放してそれをauto_ptr呼び出すのと同じ効果があります。resetauto_ptr

あなたが引用したウェブサイトは間違っています。

于 2010-04-05T03:23:47.453 に答える