std :: unique_ptr的用法
std::unique_ptr<int> p1(new int); std::unique_ptr<int> p2(new int); p2=p1;
在这里似乎p1不再是“唯一的”,因为p2也是指它
这是合法的C ++? unique_ptr是否有copy_semantics? 如果不是,并且只有移动语义,则在将其分配给p2后将p1设置为NULL?
编辑:
好的,所以正确的版本是
p2=std::move(p1)
据此,在这个分配之后,p1是无效的? 和auto_ptr的区别在这里? 我认为明确地明确所有权的转移是比auto_ptr更为安全
std :: unique_ptr是不可分配和不可复制的。 你需要使用std :: move();
所以
p1 = std::move(p2);
在这里看看更多的信息。
这是我写的一篇文章,可以回答你的问题。 我最初写这篇文章来介绍一个unique_ptr的仿真。 但是,您可以忽略处理仿真的前几个段落,并开始阅读“基本示例”。
http://howardhinnant.github.io/unique_ptr03.html
编辑:
我很难把上面的链接文章提炼成足够小的东西,以这种格式做出实际的答案。 但是,这是我的最佳拍摄:
原因:通用代码中的安全性。 一个不能真正做
auto_ptr
或unique_ptr
副本。 考虑:template <class T> void foo(T t) { T copy_of_t = t; // line 4 assert(copy_of_t == t); }
通用代码看起来像上面的
foo
并不罕见。assert
可能实际上并不存在,但是assert
经常会持有的假设是隐含的 。 事实上,一个stream行的std::sort
实现在1996年正好是这个逻辑,这正是促使第二个auto_ptr
重新devise(帮助,但没有完全解决问题)的原因。
按照这个 , p2=p1
是一个编译错误。