C++11智能指针之unique_ptr

unique_ptr的作用

只能独一无二地拥有某堆空间的对象。

释放对象的几种方式

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"<<endl;
//        up2.reset();        //手动释放 方式2
//        cout << "22222222"<<endl;
    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<int> 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的两个作用

reset函数可以不带参数,也可以带参数。如果是无参,则是释放堆空间;如果是有参,则是先释放原有堆空间,然后重新绑定一个堆区空间。

unique_ptr<int> up1(new int(11));
//up1.reset();    //如果是无参,则是释放堆空间
up1.reset(new int(22)); //如果是有参,则是先释放原有堆空间,然后重新绑定一个堆区空间
cout << "*up1=" <<*up1 <<endl;

release的作用

release的作用:释放控制权,不释放堆区空间。

unique_ptr<int> up1(new int(11));
//释放控制权,不释放堆区空间
int* p=up1.release();
cout << "*p=" <<*p <<endl;
//cout<<"*up1="<<*up1<<endl;    //err
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;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值