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 实现如何表现?如果上面引用的网站有错误/过时的信息,您推荐哪个网站作为参考?

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.

因此,分配给 an与使用从右侧释放的指针auto_ptr调用它具有相同的效果。resetauto_ptr

你引用的网站是错误的。

于 2010-04-05T03:23:47.453 回答