【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删除器部分到这里就已经完美收官了!

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

时间: 2024-10-06 20:30:17

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

指针辨析:悬垂指针、哑指针、野指针、智能指针

悬垂指针: 1:提出的原因: 请看下面的代码片段: [cpp] view plaincopyprint? int *p=NULL; void main() { int i=10;p=&i; cout<<"第一次:*p = "<<*p<<endl; cout<<"第二次:*p = "<<*p<<endl; } [cpp] view plaincopyprint? int *p=NULL;

指针简述

间接访问:通过内存单元编号((地址),以及数据所占字节数访问内存中的数据. 主要内容:指针变量指针与数组,指针与字符串 数据的存储: 其中字节是最小的存储单元,一个字节称为一个存储单元(内存单元),不同数据类型所占的存储空间不等 为了正确的访问内存单元,每个内存单元都有一个编号.内存单元的编号称为地址 内存单元的数据是今天得重点内容 访问方式: 直接访问和间接访问 直接访问: 直接访问内存空间的内容 例如 :a = 20;b = 2 * a; 间接访问: 通过内存单元编号以及数据所占字节数访问内

不要伤害指针(7)--指针类型转换

当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式.在我们前面所举的例子中,绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式所指向的类型是一样的. 例十五: float f = 12.3;float *fptr = &f;int *p; 在上面的例子中,假如我们想让指针p 指向实数f,应该怎么办?是用下面的语句吗? p = &f; 不对.因为指针p 的类型是int *,它指向的类型是int.表达式&f 的结

指针和引用(3)指针数组和数组指针

1.知识点 1.1指针数组--存放指针的数组 (1)指针数组本质上是一个数组,指针是数组中的内容,表示数组中的每个元素都是指针,因此指针数组就是存放指针的数组.下面是指针数组的用法: 1 int a = 10, b = 20; 2 int *p[3]; 3 p[0] = &a; 4 p[2] = &b; (2)指针数组的定义可以抽象为:指向变量类型 * 数组名称[数组长度]. (3)[]的优先级高于*,所以[]与p先结合,说明p是一个数组,长度为3,其数组元素的类型是int *. 1.2数

智能家居之家电智能控制系统

智能家居之家电智能控制系统是一个非常棒的中控系统.前面说我我们的智能家居主机系统非常强大,可以连接任意电子设备(电视.音响.空调.冰箱......)成为子系统.家电智能控制系统为智能家居主机系统子系统之一,为我们的家庭生活解决不少小麻烦. 还记得在远古时代,我们看电影还是用碟的.那时候特别麻烦,虽然有遥控器但每看完一场电影要换碟.然后经常会有这种事情,大冬天的夫妻俩坐床头看电影,看完一集后互相推托去换碟,谁都不愿意离开被窝去换碟,结果一场电影看了五六遍.对很多人来说这些事情已经成为永久的回忆了.

c指针 --笔记2返回指针值的函数

返回指针值的函数 一般带回指针值的函数,定义形式为: int *a (int x, int y); 看这个经典案例: #include <stdio.h> int main(int argc, char const *argv[]) { double score[][4] = {{60.0, 70.0, 80.5, 20.1}, {60.0, 70.0, 80.5, 21.1}, {60.0, 70.0, 80.5, 22.1}}; double *search(double(*pointer

C/C++笔试篇-------二维指针数组、数组指针的用法

1.废话不多说,先上代码: #include <iostream> using namespace std; int main(void) { int v[2][5] = {{1,2,3,4,5},{6,7,8,9,10}}; int (*a)[5] = v; //指针数组,指针指向数组 a[5],a[5]里面是int数值 该指针等于v的地址 cout<<(*a+1)<<endl; //*a是v[0][0]的地址. 0x22fe04 cout<<(*a+2)

C++指针数组和数组指针

指针相关问题 using namespace std; int main(){ //a) 一个整型数( An integer) int a; //b) 一个指向整型数的指针( A pointer to an integer) int *b; //c) 一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an integer) int **c; //d) 一个有 10 个整型数的数组( An array of 10 integers) int

【转】 指针函数与函数指针的区别

一. 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量. 表示: float *fun();