曲径通幽论坛

标题: unique_ptr 为什么优于 auto_ptr ? [打印本页]

作者: easy    时间: 2014-1-10 12:15
标题: unique_ptr 为什么优于 auto_ptr ?
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 。





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2