unique_ptr
unique_ptr
也是对auto_ptr
的替换。unique_ptr
遵循着独占语义。在任何时间点,资源只能唯一地被一个unique_ptr
占有。当unique_ptr
离开作用域,所包含的资源被释放。如果资源被其它资源重写了,之前拥有的资源将被释放。所以它保证了他所关联的资源总是能被释放。
创建
unique_ptr
的创建方法和shared_ptr
一样,除非创建一个指向数组类型的unique_ptr
。
unique_ptr<int> uptr( new int );
unique_ptr
提供了创建数组对象的特殊方法,当指针离开作用域时,调用delete[]
代替delete
。当创建unique_ptr
时,这一组对象被视作模板参数的部分。这样,程序员就不需要再提供一个指定的析构方法,如下:
unique_ptr<int[ ]> uptr( new int[5] );
当把unique_ptr
赋给另外一个对象时,资源的所有权就会被转移。
记住unique_ptr
不提供复制语义(拷贝赋值和拷贝构造都不可以),只支持移动语义(move semantics
).
//解释 移动语义
#include "stdafx.h"
using namespace std;
#include <iostream>
#include <memory>
class Test {
public:
~Test() {
cout << "~Test()" << endl;
}
};
void func() {
unique_ptr<Test> uptr1(new Test);
unique_ptr<Test> uptr2 = std::move(uptr1); //移动语义 执行完后不会释放资源
}
int main()
{
func();
getchar();
return 0;
}
在上面的例子里,如果upt3
和upt5
已经拥有了资源,只有当拥有新资源时,之前的资源才会释放。
接口
unique_ptr提供的接口和传统指针差不多,但是不支持指针运算。
unique_ptr
提供一个release()
的方法,释放所有权。release
和reset
的区别在于,release
仅仅释放所有权但不释放资源,reset
也释放资源。
使用哪一种智能指针?
完全取决于你想要如何拥有一个资源,如果需要共享资源使用shared_ptr
,如果独占使用资源就使用unique_ptr
.
除此之外,shared_ptr
比unique_ptr
更加重,因为他还需要分配空间做其它的事,比如存储强引用计数,弱引用计数。而unique_ptr
不需要这些,它只需要独占着保存资源对象。
因为他还需要分配空间做其它的事,比如存储强引用计数,弱引用计数。而unique_ptr
不需要这些,它只需要独占着保存资源对象。