c – unique_ptr优于auto_ptr的优点?

c – unique_ptr优于auto_ptr的优点?,第1张

概述我不完全理解unique_ptr相对于auto_ptr的好处,或者我还不完全相信为什么我们需要使用unique_ptr. 我看到以下差异. 1)unique_ptr支持数组,因此unique_ptr析构函数为数组调用delete [],而auto_ptr析构函数只调用delete. 2)必须使用std :: move()而不是在unique_ptr的情况下直接复制.但是我们用std :: move 我不完全理解unique_ptr相对于auto_ptr的好处,或者我还不完全相信为什么我们需要使用unique_ptr.

我看到以下差异.

1)unique_ptr支持数组,因此unique_ptr析构函数为数组调用delete [],而auto_ptr析构函数只调用delete.

2)必须使用std :: move()而不是在unique_ptr的情况下直接复制.但是我们用std :: move()有什么好处?我将尝试解释如下.

auto_ptr <int> p1 (new int);auto_ptr <int> p2 = p1;    // Now p1 is NulL and p2 exists with value of p1unique_ptr <int> p1 (new int);unique_ptr <int> p2 = std::move(p1);    // Now p1 is NulL and p2 exists with value of p1

那么我们将获得的优势是什么?

3)我在互联网上读到unique_ptr可以在容器中使用.但如果我理解正确,这不是unique_ptr的伟大之处.容器函数语义已经改变,所以现在一天,复制没有在容器函数内部完成.但这又是unique_ptr的优点呢?现在容器函数已经改变了,为什么我们不能在容器中使用auto_ptr?

解决方法 unique_ptr强制您明确转移所有权,因此它在代码中可见且清晰.使用auto_ptr很容易获得所有权的静默转移,并且在读取代码时,并不总是清楚所有权是否被转移,如果是,是否是代码作者想要的或者是错误!当您看到与std :: move一起使用的unique_ptr时,显然意图是转移所有权.

unique_ptr正确支持移动语义,因此它只允许从临时对象和移动的对象(即rvalues)进行所有权转移.容器可以检测类型是否“移动意识”并采取适当的行动. auto_ptr不知道移动语义,并将从左值或右值转移所有权,因此容器认为它是一个普通的可复制对象,但它不像一个行为,因为它在复制时修改了它的来源.

auto_ptr在仔细使用时非常有用,但是它太容易被滥用并编写危险的代码.是时候死了. unique_ptr支持auto_ptr可以执行的所有 *** 作,但默认情况下是安全的(您必须更加努力地使用它)并且还具有自定义删除和数组支持等额外功能.

总结

以上是内存溢出为你收集整理的c – unique_ptr优于auto_ptr的优点?全部内容,希望文章能够帮你解决c – unique_ptr优于auto_ptr的优点?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1218084.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存