c++智能指针

1)C++入门级小知识,分享给将要学习或者正在学习C++开发的同学。

2)内容属于原创,若转载,请说明出处。

3)提供相关问题有偿答疑和支持。

c++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被c++11弃用。
为什么要使用智能指针:我们知道c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最后的delete语句就返回了,如果我们不在每一个可能跳转或者返回的语句前释放资源,就会造成内存泄露。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。

首先auto_ptr有用处,但是也有很多缺陷,下面是一个使用auto_ptr比起不使用智能指针的好处:可以自动释放资源:

auto_ptr的一个特性就是具有唯一性,一旦一个指针转移就失去了原有的属性:

缺陷1:

看上面的代码当讲一个智能指针对象传递给一个函数的时候,p传递给了参数ptr,那么当ptr离开作用于的时候就会将ptr所指向的内存释放,那么最后,当尝试去掉用:
cout << p->m_a << endl;就会出错:

缺陷2:auto_ptr不能指向一组对象,就是说它不能和操作符new[]一起使用。因为以数组分配的对象要以数组的形式释放:delete[]

运行:

上面的代码将产生一个运行时错误。因为当auto_ptr离开作用域时,delete被默认用来释放关联的内存空间。当auto_ptr只指向一个对象时,这当然是没问题的,但是在上面的代码里,我们在堆里创建了一组对象,应该使用delete[]来释放,而不是delete.
 

缺陷3:
auto_ptr不能和标准容器(vector,list,map....)一起使用。
因为auto_ptr容易产生错误,所以它也将被废弃了。C++11提供了一组新的智能指针,每一个都各有用武之地。
shared_ptr
unique_ptr
weak_ptr
接下来我们一一分析:
智能指针shared_ptr,相对于auto_ptr的唯一性,它有一个叫做共享所有权(sharedownership)的概念。shared_ptr的目标非常简单:多个指针可以同时指向一个对象,当最后一个shared_ptr离开作用域时,内存才会自动释放,有点类似与之前的单例模式+引用计数的方式来实现;

下面是先定义后初始化:当使用make_shared如果使用无参构造的时候使用:make_shared<type>()

可以使用get获取原始指针值:

shared_ptr也有点类似于auto_ptr不能创建数组的形式,但是使用lamda表达式可以完美解决此问题:

下面看看unique_ptr的用法:unique_ptr也是对auto_ptr的替换。unique_ptr遵循着独占语义。在任何时间点,资源只能唯一地被一个unique_ptr占有。当unique_ptr离开作用域,所包含的资源被释放。如果资源被其它资源重写了,之前拥有的资源将被释放。所以它保证了他所关联的资源总是能被释放。

接下来看看weak_ptr:weak_ptr是为配合shared_ptr而引入的一种智能指针,它更像是shared_ptr的一个助手,而不是智能指针,因为它不具有普通指针的行为,没有重载operator*和operator->,它的最大作用在于协助shared_ptr,像旁观者那样观测资源的使用情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值