关于网友提出的“ 哪位大神给我调试下 auto_ptr 本来可以转移拥有权的但现在 (如下面q=p;应该输出q=42;p=NULL1的结果却不是 还有p是怎么得到42)”问题疑问,本网通过在网上对“ 哪位大神给我调试下 auto_ptr 本来可以转移拥有权的但现在 (如下面q=p;应该输出q=42;p=NULL1的结果却不是 还有p是怎么得到42)”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 哪位大神给我调试下 auto_ptr 本来可以转移拥有权的但现在 (如下面q=p;应该输出q=42;p=NULL1的结果却不是 还有p是怎么得到42)描述:
#include
//#include
using namespace std;
template
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); }
public:
bool _Owns;
_Ty *_Ptr;
};
template
ostream& operator << (ostream& strm,const auto_ptr
{
if(p.get() == NULL)
{
strm << "NULL1";
}
else
{
strm << *p;
}
return strm;
}
int main()
{
auto_ptr
auto_ptr
cout << "after initialization:"<<>
cout << " p: " << p << endl;
cout << " q: " << q << endl;
q = p;
cout << " after assigning auto pointers:" << endl;
cout << " p: " << p << endl;
cout << " q: " << q <<>
*q += 13;
p = q;
cout << " P:" << p << endl;
cout << "q: " << q <<>
return 0;
}
如下面q=p;应该输出q=42;p=NULL1的结果却不是 还有p是怎么得到42 应该p._Ptr=42 p怎么的得到值的
auto_ptr
解决方案1:
#include
using namespace std;
template
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);
}
public:
bool _Owns;
_Ty *_Ptr;
};
template
ostream& operator << (ostream& strm,const auto_ptr& p)
{
if(p.get() == NULL)
{
strm << "NULL1";
}
else
{
strm << *p;
}
return strm;
}
int main()
{
auto_ptrp(new int(42));
auto_ptrq;
cout << "after initialization:"<<>
cout << " p: " << p << endl;
cout << " q: " << q << endl;
q = p;
cout << " after assigning auto pointers:" << endl;
cout << " p: " << p << endl;
cout << " q: " << q <<>
*q += 13;
p = q;
cout << " P:" << p << endl;
cout << "q: " << q <<>
return 0;
}
楼主,以后贴代码的时候最好把代码规范一下,否则大家都没心情看了,上面的代码没改,只是规范一下给大家看。
没变的原因
1. 没把p的ptr付给q,也没把p的ptr置空。
2. 而且你赋值操作符的形参还是个const引用。
3. =左右引用相同相同的时候,如果你不想清除操作数的值,直接return就可以了。
我把=改了一下,你看可不可以
auto_ptr<_Ty>& operator= (auto_ptr<_Ty>& _Y) _THROW0()
{
if (this != &_Y)
{
if (_Owns)
delete _Ptr;
_Ptr = _Y.get();
_Y._Ptr = NULL;
_Owns = _Y._Owns;
}
return (*this);
}