博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C++】智能指针简述(六):智能指针总结及补充
阅读量:5350 次
发布时间:2019-06-15

本文共 1292 字,大约阅读时间需要 4 分钟。

  本文我们主要来总结一下前文介绍过的智能指针相关原理及实现,顺便补充一下前文未提到的shared_ptr删除器部分的内容.

总结:

  1.智能指针,通过RAII机制,构造对象时完成资源的初始化,析构对象时,对资源进行清理和汕尾.

  2.auto_ptr,防止拷贝/赋值对象后,析构时多次delete对象导致程序崩溃,因此它通过“转移所有权”,完成赋值/拷贝,保证只有一个对象维护、释放指针.实际开发中,并不常用.

  3.scoped_ptr与auto_ptr类似,只是它不会“转移所有权”,而是禁止对象的拷贝/赋值.(把拷贝构造函数、赋值运算符重载设为private,并且只给出声明,不提供定义)

  4.shared_ptr,通过引用计数来管理指针,当出现新对象维护同一块指针时,引用计数增加.当引用计数为1时,才真正的delete指针.

  5.weak_ptr,解决shared_ptr循环引用的问题,与shared_ptr一起使用,不能单独使用.

补充:shared_ptr定制删除器

  通过前文,我们已经知道shared_ptr是比较实用的智能指针.

  我们可以通过非常简洁的语句管理指针:

#include
#include
using namespace std;int main(){ shared_ptr
sp1(new int(10)); cout<<*sp1<

  对于我们动态申请的内存,构造时完成初始化,析构时通过delete来释放没有任何问题.

  但,倘若是一个文件类型的指针呢?

#include
#include
using namespace std;int main(){ shared_ptr
sp1(fopen("test.txt","w")); //如果不进行任何特殊处理,则程序崩溃! return 0;}

  因此,shared_ptr提供了删除器功能,我们可以通过定制删除器,来对特定的资源进行回收.

#include
#include
using namespace std;//仿函数struct Fclose{ void operator()(void *ptr){ fclose((FILE*)ptr); cout<<"不用担心,shared_ptr已经通过调用我关闭了文件!"<
sp1(fopen("test.txt","w"),Fclose()); return 0;}

  至此,定制shared_ptr删除器部分到这里就已经完美收官了!

  那么,智能指针部分到这里就告一段落了....感谢阅读!

转载于:https://www.cnblogs.com/qq329914874/p/6662309.html

你可能感兴趣的文章
关于标签之间因为换行等问题造成的空白间距问题处理
查看>>
hdu 2767(tarjan)
查看>>
sklearn之分类模型混淆矩阵和分类报告
查看>>
MySQL各存储引擎
查看>>
项目--简单导出CSV文件
查看>>
Oracle session相关数据字典(一)
查看>>
织梦文章内容提取第一张或者多张图片输出
查看>>
C#用正则表达式 获取网页源代码标签的属性或值
查看>>
BZOJ 3399 [Usaco2009 Mar]Sand Castle城堡(贪心)
查看>>
WCF(一) 简单的认知
查看>>
[MFC][DShow]简单例子
查看>>
降序排列
查看>>
十一、类型转换
查看>>
面试内容,值得一看
查看>>
UILabel
查看>>
【热门技术】三种SEO方式
查看>>
[Hades_技术]哈迪斯初级技术应用
查看>>
SQLiteOpenHelper
查看>>
Luogu P1141 01迷宫【搜索/dfs】By cellur925
查看>>
js onclick事件传参
查看>>