C++智能指针之unique_ptr


前言

  在C++中,动态内存的申请和释放是通过运算符:new 和 delete 进行管理的。其中 new 负责申请内存,delete负责释放内存。

  动态内存的使用很容易出现问题,这主要在于你需要保证在正确的时间释放内存,这是比较困难的,如果你忘记释放内存,就会造成内存泄露;有时在还有指针引用内存的情况下我们就释放了它,在这种情况下就会产生引用非法内存的指针。

  为了更容易(同时也更安全)地使用动态内存,新的标准库提供了两种智能指针类型来管理动态对象,智能指针的行为类似普通指针,最主要的区别在于它负责自动释放所指向的对象。这两种智能指针都定义在 memory 头文件内。

  • 本文是对于unique_ptr的分析。

一、unique_ptr

&emsp: 一个 unique_ptr“拥有”它所指向的对象,与shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr 被销毁时,它所指向的对象也被销毁。

  • unique_ptr的操作
    在这里插入图片描述
    在这里插入图片描述

1.1 unique_ptr类的初始化

  unique_ptr没有类似shared_ptr中make_shared的标准库函数返回一个unique_ptr,我们定义一个unique_ptr时,需要将它绑定到一个new返回的指针上,并且不能直接将new的结果用赋值运算符“=”赋值给unique_ptr(即初始化方式必须采用直接初始化方式)。

unique_ptr<double> p1;//正确
unique_ptr<int> p2(new int(42));//正确
unique_ptr<int> p3 = new int(42);//错误

1.2 unique_ptr禁止拷贝和赋值

  因为unique_ptr所指向的对象只能有一个unique_ptr指针,也就是一个引用计数。因此unique_ptr不支持普通的拷贝和赋值操作

unique_ptr<string> p1(new string("HelloWorld"));
unique_ptr<string> p2(p1);//是错误
unique_ptr<string> p3;
p3 = p1;//错误

特殊情况:

虽然两个unique_ptr不可以同时指向同一个内存对象,但是可以将一个即将销毁的unqie_ptr指针拷贝或赋值给另一个unqie_ptr

  函数的参数传递和返回值就是一个很好的例子,因为在函数内部的unique_ptr指针随着作用域的结束会自动销毁,因此可以将其作为返回值,然后将内存传递给另一个unique_ptr指针管理。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写Bug那些事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值