【C++】智能指针简述(六):智能指针总结及补充
本文我们主要来总结一下前文介绍过的智能指针相关原理及实现,顺便补充一下前文未提到的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++】智能指针简述(六):智能指针总结及补充的更多相关文章
- 【C++】智能指针简述(一):智能指针的引入
智能指针是C++中一种利用RAII机制(后面解释),通过对象来管理指针的一种方式. 在C++中,动态开辟的内存需要我们自己去维护,在出函数作用域或程序异常退出之前,我们必须手动释放掉它,否则的话就会引 ...
- C和指针 第六章 指针6.2 6.3字符串中查找的两个版本
int find_char(char **strings, char ch) { char *string; while ((string = *strings++) != NULL) { while ...
- 【C++】智能指针简述(二):auto_ptr
首先,我要声明auto_ptr是一个坑!auto_ptr是一个坑!auto_ptr是一个坑!重要的事情说三遍!!! 通过上文,我们知道智能指针通过对象管理指针,在构造对象时完成资源的分配及初始化,在析 ...
- 第六章 指针与const
const一词在字面上来源于常量constant,const对象在C/C++中是有不同解析的,如第二章所述,在C中常量表达式必须是编译期,运行期的不是常量表达式,因此C中的const不是常量表达式:但 ...
- C和C指针小记(六)-基本声明、指针声明、typedef 、常量、作用域、链接属性、存储类型、static
1.变量的声明 声明变量的基本形式: 说明符号(一个或者多个) 声明表达式列表 说明符 (specifier) 包含一些关键字,用于描述被声明的标识符的基本类型,它也可用户改变标识符的缺省存储类型和作 ...
- Const用法总结(快速区分指针常量与常量指针)
想当初面试时,面试官问我熟悉C++么?熟悉的话说一下const的用法,然后我就开始凌乱了~ 其实const的用处还真不少,好好捋顺一下会有很大的帮助. 有时候我们希望定义一种常量,它的值不能被修改,这 ...
- C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用
类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...
- 你必须知道的指针基础-7.void指针与函数指针
一.不能动的“地址”—void指针 1.1 void指针初探 void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据.和用int表示指针异曲同工,只是更明确是“指针” ...
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, con ...
随机推荐
- 009 NAT
static nat r1(config)#ip nat inside source static 192.168.1.2 10.0.0.2 r1(config)#int f0/0 r1(config ...
- Smart Home DIY 计划
工作了这么长时间了,感觉自己眼下的工作内容非常不利于技术水平的提升,对此状况,我心里深感不踏实.因此,我决定利用下班时间.边学习边做,做一套真正可用的智能家居系统,首先部署到自己居住的房间. 对此智能 ...
- Linux下的文件夹创建命令使用实践
[文章摘要] 本文以实际的C源程序为样例,介绍了Linux下的文件夹创建命令(mkdir)的用法.为相关开发工作的开展提供了故意的參考. [关键词] C语言 Linux 文件夹创建 makefi ...
- TMS320F28335项目开发记录6_28335之cmd文件具体解释
1.CMD文件的作用 CMD文件的作用就像仓库的货物摆放记录一样,为程序代码和数据分配指定的空间. 2.C语言生成的段 C语言生成的段大致分为两大类:初始化和未初始化,已初始化的段含有真正的指令和数据 ...
- Linux地址ping不通情况怎么办?
查看原文:http://www.ibloger.net/article/325.html Linux地址ping不通情况怎么办? 问题:今天写了一个微信支付的项目.有一个class中使用了httpPo ...
- VELT-0.1.6开发:载入根文件系统
快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 VELT的全称是Vi ...
- 【OI】对拍
对拍的方法是先用生成器生成几组随机数据,然后用暴力算法和当前算法对比结果来确保正确性. 数据生成器: 引入cstdlib与ctime两个库,然后通过srand初始化随机数: srand(time(0) ...
- exynos 4412 时钟配置
/** ****************************************************************************** * @author Maox ...
- js二维数组定义和初始化的三种方法总结
js二维数组定义和初始化的三种方法总结 方法一:直接定义并且初始化,这种遇到数量少的情况可以用var _TheArray = [["0-1","0-2"],[& ...
- web filter用spring注入对象
tomcat容器初始化顺序监听器–>过滤器–>servlet,因此springMVCservlet初始化之前,过滤器就已经初始化过了,如果在过滤器中需要注入spring容器管理的bean是 ...