应该std :: auto_ptr<> :: operator = reset / deallocate其现有的指针?

时间:2010-04-05 03:19:35

标签: c++ stl visual-c++ smart-pointers auto-ptr

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

1 个答案:

答案 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具有相同的效果。

您引用的网站是错误的。