我读了here关于std :: auto_ptr<> :: operator =
但请注意左侧 对象不是自动的 当它已经指向时解除分配 一些对象。你可以明确地做 这通过调用成员函数重置 在为其分配新值之前。
但是,当我读取头文件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实现如何表现?如果上面引用的网站有错误/过时的信息,您建议哪个网站作为参考?
答案 0 :(得分: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
与使用从右侧reset
释放的指针调用auto_ptr
具有相同的效果。
您引用的网站是错误的。