std::auto_ptr<>::operator=应该重置/释放其现有的指针吗?

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


我预测你至少会得到3个答案,警告你不要使用auto_ptr。但愿我手头有标准,这样我就可以验证你的参考资料了。 - Mark Ransom
1
我不会给出答案,但是我会添加这个注释,告诉你不应该使用auto_ptr。相反,应该使用boost::scoped_ptrboost::shared_ptr - rlbond
1
作为一条信息,我在cplusplus.com提交了一个错误报告。我不知道他们是否积极纠正内容错误。 - James McNellis
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的效果与使用右侧auto_ptr释放指针并调用reset相同。

您引用的网站是错误的。


你有可供我点击的链接吗?(标准链接/其他日常使用参考资料) - Afriza N. Arief
如果您想要它,您必须购买2003年的规范。您可以在此处获取C++0x标准的最终委员会草案(FCD):http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3092.pdf(请注意,它不是最终、官方或规范性文件)。 - James McNellis
1
@afriza:秘密提示:谷歌搜索“14882 pdf”。 - Potatoswatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接