小白请教一个关于auto_ptr的问题~~~

lotos 2008-04-17 05:04:34
c++primer书中讲解auto_ptr的章节中 举例说

auto_ptr <string> pstr_auto( new string ("bront"));
auto_ptr <string> pstr_auto2( pstr_auto.get());

他解释是两个指针都指向同一对象 并都拥有该对象的所有权
第2句 变量名后地()里不应该是对象嘛?
pstr_auto.get()不是取了pstr_auto地地址嘛?

恩 请指教啊~
...全文
101 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lotos 2008-04-21
  • 打赏
  • 举报
回复
恩 懂了
3. auto_ptr <string> pstr_auto2( pstr_auto.get());
这句实际上直接拿出来人家地地址给了自己
2. auto_ptr <string> pstr_auto2( pstr_auto );
而这句是把pstr_auto地地址给了pstr_auto2,而且把pstr_auto给删地掉了
3句会出错地
对吧~
谢谢大家指导!
ftkghost 2008-04-18
  • 打赏
  • 举报
回复
auto_ptr <string> pstr_auto( new string ("bront"));
auto_ptr <string> pstr_auto2( pstr_auto.get()); //不转移所有权,当pstr_auto,pstr_auto2出了作用域统一地址会被delete两次会出错(get()会获取原始指针,使用auto_ptr就是为了防止资源泄露,所以一般情况下别直接使用原始指针)

auto_ptr <string> pstr_auto2( pstr_auto ); //string ptr的所有权转给pstr_auto2

你可以看看auto_ptr的代码
auto_ptr(const auto_ptr<_Ty>& _Y) _THROW0()
: _Owns(_Y._Owns), _Ptr(_Y.release()) {}
~auto_ptr(){if (_Owns) delete _Ptr; } //_Owns是auto_ptr的成员,标志对象当前是否对指针指向的内存具有所有权
_Ty *release() const _THROW0()
{((auto_ptr<_Ty> *)this)->_Owns = false;
return (_Ptr); }
_Ty *get() const _THROW0()
{return (_Ptr); }
PS:这是VS自带的CPP库,各编译器自带的标准库可能不同。
lessonzhe 2008-04-18
  • 打赏
  • 举报
回复
str_auto.get(),得到的是第一句(new string ("bront"))值。

auto_ptr <string> pstr_auto( new string ("bront"));
auto_ptr <string> pstr_auto2( pstr_auto.get());
这二行代码,在函数体结束后,pstr_auto和pstr_auto2同时释放同一个指针,程序会出异常。
正确的写法是:
auto_ptr <string> pstr_auto( new string ("bront"));
auto_ptr <string> pstr_auto2( pstr_auto);
让 pstr_auto释放控制权,而pstr_auto2得到控制权


liveforme 2008-04-18
  • 打赏
  • 举报
回复
构造函数重载,pstr_auto是对象, pstr_auto.get()得到的是pstr_auto的成员指针,
效果是一样的,但概念不同
lotos 2008-04-18
  • 打赏
  • 举报
回复
恩,现在知道了变量名后地()里其实应该是放地一个地址 三个例子我都放在下面:

1. auto_ptr <string> pstr_auto( new string ("bront"));
2. auto_ptr <string> pstr_auto2( pstr_auto );
3. auto_ptr <string> pstr_auto2( pstr_auto.get());

那么1句中pstr_auto就是把(new string ("bront"))的地址给拿了出来对吧
2句中是 pstr_auto中地地址现在转交给了pstr_auto2,和1句应该是等价地 pstr_auto2指向地地址是(new string ("bront"))地地址来
那么3句中是把pstr_auto地什么深层内部地址给拿了出来转给了pstr_auto2对吧 书中说1句和3句是"解释是两个指针都指向同一对象 并都拥有该对象的所有权" 也就是说 现在3句中地pstr_auto2也是指向(new string ("bront"))地地址来

那么2句和3句是等价地? 恩 这是我真正地疑问...

希望高手给我说说看撒
jieao111 2008-04-17
  • 打赏
  • 举报
回复
他解释是两个指针都指向同一对象 并都拥有该对象的所有权


我怎么记得好像是转移所有权
tgh621 2008-04-17
  • 打赏
  • 举报
回复
个人认为:对象存储的本来就是地址,取地址后还是原地址
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-04-17 05:04
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下