只能独一无二地拥有某堆空间的对象。
1、自动释放。普通变量,系统分配对象到栈上,出作用域时会自动析构。
2、手动释放 方式1:将对象置为nullptr。
3、手动释放 方式2:调用reset()函数。
4、手动释放 方式3:调用get_deleter()获取到deleter函数,调用get()获取到指针,然后执行deleter函数。
代码如下:
class Test
{
public:
Test(){}
~Test()
{
cout <<"destructor" <<endl;
}
};
unique_ptr<int> up1(new int(11));
cout << "*up1=" <<*up1 <<endl; //重载了operator *()
{
unique_ptr<Test> up2(new Test());
// up2 = nullptr; //手动释放 方式1
// cout << "111111111"<
// up2.reset(); //手动释放 方式2
// cout << "22222222"<
default_delete<Test> deleter= up2.get_deleter();
deleter(up2.get()); //手动释放 方式3
cout << "33333333"<<endl;
}//up2生命周期结束,自动释放
cout << "---------------"<<endl;
可以看下C++文档定义:
unique_ptr& operator= (const unique_ptr&) = delete;
即是禁用拷贝赋值函数的。
unique_ptr<int> up1(new int(11));
//unique_ptr up2=up1; //禁用拷贝构造函数
unique_ptr<int> up2=std::move(up1);//可以移动
cout << "*up2=" <<*up2 <<endl;
unique_ptr<int> up3(std::move(up2)); //移动构造
cout << "*up3=" <<*up3 <<endl;
reset函数可以不带参数,也可以带参数。如果是无参,则是释放堆空间;如果是有参,则是先释放原有堆空间,然后重新绑定一个堆区空间。
unique_ptr<int> up1(new int(11));
//up1.reset(); //如果是无参,则是释放堆空间
up1.reset(new int(22)); //如果是有参,则是先释放原有堆空间,然后重新绑定一个堆区空间
cout << "*up1=" <<*up1 <<endl;
release的作用:释放控制权,不释放堆区空间。
unique_ptr<int> up1(new int(11));
//释放控制权,不释放堆区空间
int* p=up1.release();
cout << "*p=" <<*p <<endl;
//cout<<"*up1="<<*up1<
delete p;
判断指针是否为空的方法:(1)!up1 (2) null (3)nullptrup3.get()
unique_ptr<int> up1(new int(11));
unique_ptr<int> up2;
unique_ptr<int> up3=nullptr;
if(!up1)
{
cout << "up1 is null" << endl;
}
if(nullptr == up2)
{
cout << "up2 is null" << endl;
}
if(nullptr==up3.get())
{
cout << "up3 is null" << endl;
}
交换: (1)unique_ptr成员函数swap (2)全局模板函数swap。
unique_ptr<int> up1(new int(11));
unique_ptr<int> up2(new int(22));
unique_ptr<int> up3=nullptr;
//unique_ptr成员函数swap
cout << "*up1=" << *up1 << ", **up2=" << *up2 << endl;
up1.swap(up2);
cout << "*up1=" << *up1 << ", **up2=" << *up2 << endl;
//全局模板函数swap
std::swap(up1, up2);
cout << "*up1=" << *up1 << ", **up2=" << *up2 << endl;