我不完全理解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 p1
unique_ptr <int> p1 (new int);
unique_ptr <int> p2 = std::move(p1); // Now p1 is NULL and p2 exists with value of p1
有什么优势呢?我将尝试解释如下。
unique_ptr
那么我们将获得的优势是什么呢?
3)我在互联网上读到unique_ptr
可以在容器中使用。但如果我理解正确,这不是unique_ptr
的伟大之处。容器函数语义已经改变,所以现在一天,复制没有在容器函数内部完成。但这对auto_ptr
来说有什么好处呢?既然容器函数已经改变了,为什么我们不能在容器中使用{{1}}?
答案 0 :(得分:11)
unique_ptr
迫使您明确转让所有权,因此代码中可见且清晰。使用auto_ptr
,很容易获得所有权的静默转移,并且在阅读代码时,并不总是清楚所有权是否已转移,如果是,是否是代码作者的意图或是一个错误!当您看到unique_ptr
与std::move
一起使用时,显然意图是转让所有权。
unique_ptr
正确支持移动语义,因此它只允许从临时对象和移动的对象(即rvalues)进行所有权转移。容器可以检测类型是否是&#34;移动意识&#34;并采取恰当的行动auto_ptr
不知道移动语义,并且会从左值或右值转移所有权,因此容器认为它是一个普通的可复制对象,但它不像一个行为因为它在复制时修改了它的来源。
auto_ptr
非常有用,但是很容易误用它并编写危险的代码。是时候死了。 unique_ptr
支持auto_ptr
可以执行的所有操作,但默认情况下是安全的(您必须更加努力地使用它)并且还具有自定义删除和数组支持等额外功能。