智能指针auto_ptr 在我理解是用一个对象来管理原生指针,通过拥有权Owns的控制,在智能指针对象析构时来释放原生指针的空间,以此来保证内存总是被释放掉,避免内存泄露。
<span style="font-size:14px;">template<class _Ty>
class auto_ptr {
public:
typedef _Ty element_type;
explicit auto_ptr(_Ty *_P = 0) _THROW0()
: _Owns(_P != 0), _Ptr(_P) {}
auto_ptr(const auto_ptr<_Ty>& _Y) _THROW0()
: _Owns(_Y._Owns), _Ptr(_Y.release()) {}
auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y) _THROW0()
{if (this != &_Y)
{if (_Ptr != _Y.get())
{if (_Owns)
delete _Ptr;
_Owns = _Y._Owns; }
else if (_Y._Owns)
_Owns = true;
_Ptr = _Y.release(); }
return (*this); }
~auto_ptr()
{if (_Owns)
delete _Ptr; }
_Ty& operator*() const _THROW0()
{return (*get()); }
_Ty *operator->() const _THROW0()
{return (get()); }
_Ty *get() const _THROW0()
{return (_Ptr); }
_Ty *release() const _THROW0()
{((auto_ptr<_Ty> *)this)->_Owns = false;
return (_Ptr); }
private:
bool _Owns;
_Ty *_Ptr;
};</span>拷贝构造函数
<span style="font-size:14px;">auto_ptr(const auto_ptr<_Ty>& _Y) _THROW0()
: _Owns(_Y._Owns), _Ptr(_Y.release()) {}</span>
<span style="font-size:14px;">auto_ptr(const auto_ptr<_Ty>& _Y) _THROW0()
:<span style="font-family: Arial, Helvetica, sans-serif;">_Ptr(_Y.release())</span>,_Owns(_Y._Owns), {}</span>看起来是Y先失去拥有权,再对_Owns赋值,似乎_Owns总是false.但在我自己写这个auto_ptr时确实把拷贝构造写成了上面的样子,但_Owns仍能被正确赋值。<span style="font-size:14px;">private:
bool _Owns;
_Ty *_Ptr;</span>_Owns的初始化总早于_Ptr<span style="font-size:14px;">auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y) _THROW0()
{if (this != &_Y)
{if (_Ptr != _Y.get())
{if (_Owns)
delete _Ptr;
_Owns = _Y._Owns; }
else if (_Y._Owns)
_Owns = true;
_Ptr = _Y.release(); }
return (*this); }</span>当用一个智能指针对象赋值另一个智能指针对象时同样要考虑_Owns的问题,不能两个对象对同一块内存都有拥有权,同时还要考虑被修改的这个指针原来管理的那块内存要释放掉。但源码中这种写法有一个小问题<span style="font-size:14px;">_Ty *release() const _THROW0()
{((auto_ptr<_Ty> *)this)->_Owns = false;
return (_Ptr); }</span><span style="font-size:14px;">((auto_ptr<_Ty> *)this)->_Owns = false;</span>那这语句为什么要进行强制类型转换,是为了去掉this指针的常性,从而能再const修饰的成员函数中修改_Owns
826



被折叠的 条评论
为什么被折叠?



