![](/img/trans.png)
[英]Usage of std::unique_ptr in combination with custom free-operations
[英]std::unique_ptr usage
std::unique_ptr<int> p1(new int);
std::unique_ptr<int> p2(new int);
p2=p1;
在这里似乎p1不再是“唯一的”,因为p2也指它
这是合法的c ++? unique_ptr有copy_semantics吗? 如果不是,并且它只有移动语义,那么在将p1分配给p2后p1是否设置为NULL?
编辑:
好的,所以正确的版本是
p2=std::move(p1)
据此,在此分配后,p1无效? 与auto_ptr的区别在哪里? 所有权明确规定所有权转让比隐式更安全,因为我认为auto_ptr是这种情况
这是我写的一篇文章,回答了你的问题。 我最初写这篇文章是为了展示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
经常持有的假设是...... 隐含的 。 实际上,一个流行的std::sort
实现在1996年完全具有这个逻辑,这正是促使第二次auto_ptr
重新设计的原因(这有助于,但没有完全解决问题)。
按照此 , p2=p1
是编译错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.