关于 auto_ptr 的 operator=
我的程序是这样的:
#include <iostream>
#include <memory>
using namespace std;
template <class T>
ostream& operator<< (ostream& strm, const auto_ptr<T>& p)
{
if(p.get() == NULL)
{
strm<<"NULL";
}
else
{
strm<<*p;
}
return strm;
}
int main()
{
auto_ptr<int> p1(new int(100));
auto_ptr<int> p2;
cout<<"before assign ..."<<endl;
cout<<"p1 : "<<p1<<endl;
cout<<"p2 : "<<p2<<endl;
p2 = p1;
cout<<"after assign ..."<<endl;
cout<<"p1 : "<<p1<<endl;
cout<<"p2 : "<<p2<<endl;
return 0;
}
预计的输出是:
before assign ...
p1 : 100
p2 : NULL
after assign ...
p1 : NULL
p2 : 100
但是实际的输出是:
before assign ...
p1 : 100
p2 : NULL
after assign ...
p1 : 100 //这里有问题
p2 : 100
也就是说,当执行 p2 = p1 的操作后,p1仍指向 int 对象,而并不是指向 NULL 的指针
根据 auto_ptr 的operaotr= 的定义,不是说当指省 p2 = p1 的时候,p2 会指向p1的对象
而p1则指向 NULL 吗
我用的是VC6,会是编译器的问题吗
问题点数:20、回复次数:5Top
1 楼windywater(超级宇宙无敌大白痴)回复于 2005-08-17 15:11:15 得分 5
我以前也问过这个问题,不过现在还不是太清楚。看看这个:
http://community.csdn.net/Expert/topic/4203/4203530.xml?temp=.9546015
Top
2 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2005-08-17 15:13:01 得分 5
显然是实现的问题。
源码用了release,只是有个Own表示释放其所用权,但是其他的不动!这就是原理了。
但是并没有显示说p2指向设置为NULL。
代码是这么说的,我刚刚看过。Top
3 楼R9R9R9(猪头饼)回复于 2005-08-17 15:24:03 得分 5
可以是编译器的问题..在DEV-C++中的结果就如楼主所言
before assign ...
p1 : 100
p2 : NULL
after assign ...
p1 : NULL
p2 : 100
Top
4 楼foochow(无聊,灌水......)回复于 2005-08-17 15:36:23 得分 5
这个是VC中stl的bug,因为vc的stl比较早了,原来的stl中auto_ptr是有这个bug的,后来修正了,可是vc中的已经出了,这个bug就留下来了...
具体的可以看more excpetion C++....
vc6下的代码
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);
}
//release函数
_Ty *release() const _THROW0()
{
((auto_ptr<_Ty> *)this)->_Owns = false;
return (_Ptr);
}
............
从代码里看的很清楚,没有释放p1的指针,只是把p1的一个表示所有权的标志_Owns给设成false了.Top
5 楼Cocoky(我爱野百合)回复于 2005-08-17 17:13:55 得分 0
学习Top




