曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 2994|回复: 0
打印 上一主题 下一主题

unique_ptr 为什么优于 auto_ptr ?

[复制链接]

716

主题

734

帖子

2946

积分

超级版主

Rank: 9Rank: 9Rank: 9

积分
2946
跳转到指定楼层
楼主
发表于 2014-1-10 12:15:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Q:unique_ptr 为什么优于 auto_ptr
A :在《auto_ptr 的所有权概念》里已经简单的提到过 unique_ptr 要比 auto_ptr 要来得严格,因为编译阶段提出错误总比在运行时程序崩溃要来得好。因此,unique_ptr 要比 auto_ptr 更安全。


对于《auto_ptr 的所有权概念》里提到的 auto_ptr 不好之处在于,将一个智能指针赋给另一个之后,会留下一个危险的悬挂指针。然而,并不是将一个智能指针赋值给另一个就一定会留下一个危险的悬挂指针,考虑下面的语句:
  1. unique_ptr<string> demo(const char *s)
  2. {
  3.     unique_ptr<string> temp(new string(s));
  4.     return temp;
  5. }


  6. unique_ptr<string> ps;
  7. ps = demo("hello world");
复制代码
这里,demo() 返回一个临时的 unique_ptr ,通过赋值,ps 就接管了原本属于 unique_ptr 所有的对象。在返回时,临时的 unique_ptr 被销毁,也就是说没有机会使用 unique_ptr 来访问无效的数据,换句话来说,没有理由禁止这种赋值。实际上,编译器确实允许这种赋值。


总之,程序试图将一个 unique_ptr 赋值给另一个时,如果源 unique_ptr 是个临时右值,编译器允许这么做;如果源 unique_ptr 将存在一段时间,编译器将禁止这么做,比如:
  1. unique_ptr<string> pu1(new string ("hello world"));
  2.         unique_ptr<string> pu2;

  3.         pu2 = pu1;
复制代码
如上代码,这种赋值是不允许的。因为,这将留下悬挂的 unique_ptr(pu1),这可能导致危害。像下面的代码就不会留下悬挂的 unique_ptr :
  1. unique_ptr <string> pu3;
  2. pu3 = unique_ptr<string> (new string ("hello world"));
复制代码
因为它调用 unique_ptr 的构造函数,该构造函数创建的临时对象在其所有权让给 pu3 后就会被销毁。这种岁情况而已的行为表明,unique_ptr 优于允许两种赋值的 quto_ptr 。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 00:02 , Processed in 0.086685 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表