本文我们主要来总结一下前文介绍过的智能指针相关原理及实现,顺便补充一下前文未提到的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<iostream>
#include<memory>
using namespace std;
int main(){
shared_ptr<int> sp1(new int(10));
cout<<*sp1<<endl;
*sp1 = 20;
cout<<*sp1<<endl;
return 0;
}

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

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

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

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

#include<iostream>
#include<memory>
using namespace std; //仿函数
struct Fclose{
void operator()(void *ptr){
fclose((FILE*)ptr);
cout<<"不用担心,shared_ptr已经通过调用我关闭了文件!"<<endl;
}
}; int main(){
//我们通过传入仿函数,来完成对文件指针的清理
shared_ptr<FILE> sp1(fopen("test.txt","w"),Fclose());
return 0;
}

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

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

【C++】智能指针简述(六):智能指针总结及补充的更多相关文章

  1. 【C++】智能指针简述(一):智能指针的引入

    智能指针是C++中一种利用RAII机制(后面解释),通过对象来管理指针的一种方式. 在C++中,动态开辟的内存需要我们自己去维护,在出函数作用域或程序异常退出之前,我们必须手动释放掉它,否则的话就会引 ...

  2. C和指针 第六章 指针6.2 6.3字符串中查找的两个版本

    int find_char(char **strings, char ch) { char *string; while ((string = *strings++) != NULL) { while ...

  3. 【C++】智能指针简述(二):auto_ptr

    首先,我要声明auto_ptr是一个坑!auto_ptr是一个坑!auto_ptr是一个坑!重要的事情说三遍!!! 通过上文,我们知道智能指针通过对象管理指针,在构造对象时完成资源的分配及初始化,在析 ...

  4. 第六章 指针与const

    const一词在字面上来源于常量constant,const对象在C/C++中是有不同解析的,如第二章所述,在C中常量表达式必须是编译期,运行期的不是常量表达式,因此C中的const不是常量表达式:但 ...

  5. C和C指针小记(六)-基本声明、指针声明、typedef 、常量、作用域、链接属性、存储类型、static

    1.变量的声明 声明变量的基本形式: 说明符号(一个或者多个) 声明表达式列表 说明符 (specifier) 包含一些关键字,用于描述被声明的标识符的基本类型,它也可用户改变标识符的缺省存储类型和作 ...

  6. Const用法总结(快速区分指针常量与常量指针)

    想当初面试时,面试官问我熟悉C++么?熟悉的话说一下const的用法,然后我就开始凌乱了~ 其实const的用处还真不少,好好捋顺一下会有很大的帮助. 有时候我们希望定义一种常量,它的值不能被修改,这 ...

  7. C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用

    类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...

  8. 你必须知道的指针基础-7.void指针与函数指针

    一.不能动的“地址”—void指针 1.1 void指针初探 void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据.和用int表示指针异曲同工,只是更明确是“指针” ...

  9. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

随机推荐

  1. 【大数据处理架构】1.spark streaming

    1. spark 是什么? >Apache Spark 是一个类似hadoop的开源高速集群运算环境  与后者不同的是,spark更快(官方的说法是快近100倍).提供高层JAVA,Scala, ...

  2. 手动脱RLPack壳实战

    作者:Fly2015 吾爱破解论坛培训第一课选修作业练习的第7题. 这个壳没听说过.可是脱起来比較简单.依据ESP定律就可以直达光明,Dump出原来的程序. 老规矩.首先对须要脱壳的程序进行查壳处理. ...

  3. Effective C++ Item 41 了解隐式接口和编译期多态

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:class 和 templates 都支持接口和多态. 对 classes 而言接口是 ...

  4. mingw32-gcc.exe: error: CreateProcess: No such file or directory

    用code::blocks在windows平台下,搭建object c编译环境时,出现这个错误. 解决的方法: 将setting -> compliler -> Toolchain exe ...

  5. Ganglia API安装与使用

    Ganglia监控本身没有提供API可供外部程序调用,只是依据ganglia监控的原理,能够通过分析gmetad的port的xml来直接获取metrics. Guardian已经在Github上公布了 ...

  6. sharepoint 訪问缩略图

    Sharepoint缩略图 简单介绍 Sharepoint2010中有专门的图片库,当你新建图片库后,向图片上传一部分图片.当你浏览这个库时显示一排排小图片.当点击一个图片时进入显示的是大图.不要简单 ...

  7. 托管C++线程锁实现 c++11线程池

    托管C++线程锁实现   最近由于工作需要,开始写托管C++,由于C++11中的mutex,和future等类,托管C++不让调用(报错),所以自己实现了托管C++的线程锁. 该类可确保当一个线程位于 ...

  8. 【codevs2183】匹配字符串

    KMP裸题 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring ...

  9. python包格式

    1 egg和wheel 前者扩展名是.egg,后者扩展名是.whl 它们都是python的模块.后者用来替换前者. wheel是轮子的意思,就是说,有了.whl包就不需要重新再造轮子了.

  10. Notification操作大全

    目录 一:普通的Notification Notification 的基本操作 给 Notification 设置 Action 更新 Notification 取消 Notification 设置 ...