std::auto_ptr<>::operator = 重置/取消分配其现有指针?
我在这里读到了关于std::auto_ptr的内容: :运算符=
但是请注意,左侧 对象不会自动 当它已经指向时释放 某个对象。你可以明确地做 通过调用成员函数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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果被分配的
auto_ptr
已经持有一个指针,则必须首先删除该指针。摘自 2003 年标准 (§20.4.5.1):
因此,分配给
auto_ptr
与通过从右侧auto_ptr
释放指针来对其调用reset
具有相同的效果。你引用的网站是错误的。
If the
auto_ptr
being assigned to already holds a pointer, that pointer must be deleted first.From the 2003 standard (§20.4.5.1):
So, assigning to an
auto_ptr
has the same effect as callingreset
on it with the pointer released from the right hand sideauto_ptr
.The website you cite is wrong.