【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 ...
随机推荐
- jupyter-notebook添加python虚拟环境的kernel
参考: jupyter notebook添加kernel 在jupyter notebook上使用虚拟环境 本文是在anaconda的环境下配置的,装好anaconda后,jupyter-notebo ...
- Android GMS无法通过网络定位
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载.但请保留文章原始出处: CSDN:http://www.csdn.net ...
- nginx-Proxy Cache缓存
1.创建目录 mkdir /export/Data/nginx_proxy_cache mkdir /export/Data/nginx_proxy_temp 2.修改http,打开缓存 文件 ...
- 【bzoj3676】[Apio2014]回文串 —— 回文自动机的学习
写题遇上一棘手的题,[Apio2014]回文串,一眼看过后缀数组+Manacher.然后就码码码...过是过了,然后看一下[Status],怎么慢这么多,不服..然后就搜了一下,发现一种新东西——回文 ...
- ReSharper warns: “Static field in generic type”
http://stackoverflow.com/questions/9647641/resharper-warns-static-field-in-generic-type It's fine to ...
- POJ1743 Musical Theme 最长重复子串 利用后缀数组
POJ1743 题目意思是求不重叠的最长相同变化的子串,输出该长度 比如1 2 3 4 5 6 7 8 9 10,最长长度为5,因为子串1 2 3 4 5 和 6 7 8 9 10变化都一样的 思路: ...
- A bad vacation
My story happened in the winter of 2012, the first year I began to work in Beijing. It was a cold we ...
- bzoj4264
哈希 cf原题...没见过的话真想不出来 将邻接表排序哈希,判断是否相同,但是会漏掉两点相邻的情况,于是再把自己加入自己的邻接表,然后再哈希判断. #include<bits/stdc++.h& ...
- 编译Ruby2.0 问题解决
compiling readline.creadline.c: In function ‘Init_readline’:readline.c:1886:26: error: ‘Function’ un ...
- PCB SI9000阻抗计算引擎Web方式实现方法
在笔者从业这么多年,PCB行业阻抗计算工具都是用Polar公司的阻抗计算工具SI9000,或早期上个版 本SI8000 Prolar是老牌公司,但也不断在推出新的产品,可以进去去了解一下 http ...