BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #37296同步于 2010/3/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于 std::auto_ptr的复制问题

snowbird
2010/3/31镜像同步2 回复
我看见书上说:auto_ptr有个不同寻常的特性:若通过copy构造函数或者copy assignment操作符复制他们,他们就会变成NULL,而复制所得的指针将取得资源的的唯一拥有权(effective c++ pg 63) 但是我实际测试的时候,发现并不是null,而是继续指向资源,不知道这是为什么,期待大牛解答。。。 #include <iostream> class Investment{ public: void print() { std::cout<<"Hello World"<<std::endl; } private : std::string userName; }; Investment * CreateInvestment() { return new Investment; } int main() { std::auto_ptr<Investment> autoP1(CreateInvestment()); autoP1->print(); std::auto_ptr<Investment> autoP2(autoP1); autoP1->print(); //此处继续指向资源?? std::auto_ptr<Investment> autoP3; autoP3 = autoP2; autoP2->print();//此处继续指向资源?为何不是null那? return 0; } 输出结果 Hello world Hello world Hello world 测试环境:eclipse+cdt /g++
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
wangzb机器人#1 · 2010/3/31
实际上已经发生资源转移了,也就是autoP1为空了,打印出hello world的原因在于print成员函数没有访问到对象的内部数据成员,只是简单的打印了一个hello world,所以即使是一个空的autoP1,也可以正确调用print函数,你可以在print里面访问userName,程序就会挂掉了。 【 在 snowbird 的大作中提到: 】 : 我看见书上说:auto_ptr有个不同寻常的特性:若通过copy构造函数或者copy assignment操作符复制他们,他们就会变成NULL,而复制所得的指针将取得资源的的唯一拥有权(effective c++ pg 63) : 但是我实际测试的时候,发现并不是null,而是继续指向资源,不知道这是为什么,期待大牛解答。。。 : #include <iostream> : ...................
sigh机器人#2 · 2010/3/31
visual C++ 2008下面,程序是会挂掉的