十一.智能指针" title="智能指针">智能指针的扩展
在前面一节,我们简单介绍了标准库给我们提供的三种智能指针的使用方法。然而在实际使用过程中有的资源的创建和释放并不是简单的new 和 delete。 比如说:对于数据库连接来说,创建资源是连接数据库而释放资源是断开连接。所以,对于智能指针自带的资源释放手段(delete)有时候就不太适用了。当然,智能指针的设计者也考虑到这一点;所以智能指针允许使用者指定资源的释放方式。
十二.向智能指针传递删除器。
智能指针 shared_ptr , unique_ptr 默认释放内存的方式都是通过 delete 自身保存的指针(unique_ptr支持动态数组所以会动态使用delete 或者delete[]) 。然而,我们也可以通过给指针指定一个函数来作为释放资源的方法。
假定我们正在使用一个c和c++都是用的网络库,使用这个库的代码有可能是这样:
这个时候我们就可以使用智能指针来帮我们管理连接,达到不用时自动关闭。
unique_ptr传入的删除器有点区别,如果将上面的代码改为unique_ptr为这样:
unique_ptr不仅需要传入删除器,还需要显式指定删除器的指针类型。 不过相同的是,传入的删除器都有统一的规范,也就是只能一个参数,并且可以由智能指针保存类型的T*隐式转换得到。返回值无特殊要求。
十三.shared_ptr管理动态数组。
我们在上一节说过,unique_ptr可以用于管理动态数组,因为unique_ptr不仅重载了[]操作符而且自带删除器可以自动识别delete还是delete[]。 然而shared_ptr可没有这样的功能,不过我们既然学了如何给智能指针传递删除器,那么我们也可以用shared_ptr来管理动态数组。
以上代码,因为我们重新给sp定义了删除器,那么当释放资源的时候就会使用delete[]而不是delete。 然而到底shared_ptr本身就不支持动态数组,所以shared_ptr在访问的时候就会相对麻烦一点。
前面这几节对智能指针的使用简单介绍。下一节会介绍智能指针在使用过程中需要小心注意的地方以及智能指针的陷阱。
还没有评论,来说两句吧...