智能指针初探

智能指针

智能指针实质:一个对象,行为表现的却像一个指针。它与普通指针的区别在于智能指针实际上是对普通指针加了一层封装机制,其目的是使得智能指针可以方便的管理一个对象的生命期。

智能指针主要用于确保程序不存在内存和资源泄露且是异常安全的。智能指针对于RAII(获取资源即初始化)编程很重要。其目的是确保资源获取与对象初始化同时发生,从而能够创建该对象的所有资源并在某行代码中准备就绪。RAII主要原则:将任何对分配资源(动态分配内存或系统对象句柄)的所有权提供给其析构函数包含用于删除或释放资源的代码以及任何相关清理代码的堆栈分配对象。多数情况,初始化原始指针或资源句柄以指向实际资源时,会立即将指针传递给智能指针。

智能指针思路类似于创建对象过程:创建对象后让系统负责在正确的时间将其删除。注意:请始终在单独的代码上创建智能指针,而绝不在参数列表中创建智能指针,这样就不会由于某些参数列表分配规则而发生轻微泄露资源的情况。智能指针的设计原则是在内存和性能上尽可能高效。

智能指针类型如下:

1)unique_ptr:只允许基础指针的一个所有者。可以移到新所有者,但不会复制和共享。它小巧高效,大小等同于一个指针且支持rvalue引用,从而可实现快速插入和对STL集合的检索。

2)shared_ptr:采用引用计数的智能指针。若想将一个原始指针分配给多个所有者(如,从容器返回了指针副本,又想保留原始指针时),可以使用该指针。当所有的shared_ptr超出了范围或放弃所有权,才会删除原始指针。大小为两个指针:一个用于对象,一个用于包含引用计数的共享控制块。

3)weak_ptr:结合share_ptr使用的特例智能指针。它提供一个或多个shared_ptr实例拥有的对象的访问,但不参与引用计数。如果想观察某个对象,但不需要其保持活动状态,可以使用该实例。

boost库中的智能指针

scoped_ptr:当这个指针的作用于结束之后自动释放,与auto_ptr不同之处在于,所有权不能转移,但是可以交换。

shared_ptr:内部维护一个引用计数器来判断此指针是不是被释放。

instrusive_ptr:也维护一个轻量级的引用计数器,比shared_ptr有更好的性能,但是要求T自己提供这个计数器。

weak_ptr:弱指针,它不控制对象的生命期,但是它知道对象是否还活着。如果对象还活着,那么它可以提升(promote)为有效的shared_ptr;如果对象已经死了,提升会失败,返回一个空的shared_ptr。

scoped_array:与scoped_ptr相似,用来处理数组。

shared_array:与shared_ptr相似,用来处理数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值