c++之独立和共享智能指针学习篇

unique_ptr 智能指针篇

简介:

作为智能指针的一种,被设计出来最关键的目的就是解决原生指针安全性不足的问题

声明语法:

std::unique_ptr<类型> 变量名 {初始化值};

注意点: 最好配合std::make_unique来初始化unique_ptr

举例如下:

第一种:

	// 初始化一个数据类型空间,括号内为初始化的值
	std::unique_ptr upa{ std::make_unique(150) };
	std::cout << "upa = " << *upa << std::endl;

结果:
在这里插入图片描述

第二种:

	//初始化许多个数据类型空间,圆括号内为初始化空间个数,这里即可放10个int
	std::unique_ptr upb{ std::make_unique(10) };
	upb[0] = 10; upb[1] = 20; //一看就懂
	std::cout << "upb[0] = " << upb[0] <<  " upb[1] = " << upb[1]<< std::endl;

结果:
在这里插入图片描述

重要特性:

此指针的特性跟他的名字一样具有唯一性,即无法让两个以上unique指针指向相同的内存地址。

来个错误的例子:

	std::unique_ptr upa{ std::make_unique(20) };  //第一个unique指针
	std::unique_ptr upb{ upa };  //初始化时指向第一个,直接报错,编译过不去

常用方法:

1、get()

简介: 返回unique的原生指针!怎么理解?请看下面:

	
	std::unique_ptr upa{ std::make_unique(20) };
	int* pa = upa.get();  //定义一个原生指针接收它就可以了
	std::cout << "pa=" << *pa << std::endl;

结果:
在这里插入图片描述

2、reset()

简介: 释放unique指针的内存空间,并且将指针指向nullptr(c++11及其以上)

举例如下:

	std::unique_ptr upa{ std::make_unique(20) };
	upa.reset();  //释放内存并且指向nullptr
	std::cout << upa << std::endl;

结果:
在这里插入图片描述

3、release()

简介: 返回原unique指针指向的内存地址,但是将unique指针指向空,如何理解?

举例如下:

	std::unique_ptr upa{ std::make_unique(20) };
	std::cout << "原upa地址=" << upa << std::endl;
	int * a = upa.release();
	std::cout << "a地址="<< a << std::endl;
	std::cout << "新upa地址=" << upa << std::endl;

结果:
在这里插入图片描述

4、std::move(unique_ptr)

简介: 为了解决unique唯一性而不能转移到另一个unique的特性

举例如下:

	std::unique_ptr upa{ std::make_unique(20) };
	std::unique_ptr upb{};
	std::cout << "原upa==" << upa << std::endl;
	upb = std::move(upa);
	std::cout << "upb==" << upb << std::endl;
	std::cout << "新upa==" << upa << std::endl;

结果:
在这里插入图片描述
注意点: 它不是类的方法,而是std标准库里的函数;与get不同的是,他是直接转移到李刚一个unique指针上,而get是转移到原生指针!

sharedx_ptr 智能指针篇

简介:

不同于unique,他可以定义很多个shared指针指向同一个地址;智能在什么地方么?只有当最后一个shared指针释放的时候,这块内存才会释放!并且可以记录当前地址有多少智能指针调用

声明语法:

std::sharedx_ptr<类型> 变量名 {初始化值};

注意点: 最好配合std::make_shared来初始化shared_ptr

举例如下:

	//第一种,跟unique一样的形式,只是把unique换成shared
	std::shared_ptr spa{ std::make_shared(50) }; 
	
	//第二种  这种方法不行,用第三种替换
	//std::shared_ptr spb{ std::make_shared(4) };
	
	//第三种 //用new申请数组形式替代即可
	std::shared_ptr spc{ new int[4]{1,2,3,4} };

常用方法:

1、use_count()

简介: 返回当前地址有多少shared_ptr调用

代码:

	std::shared_ptr spa{ std::make_shared(50) }; 
	std::cout << spa.use_count() << std::endl;   //1
	std::shared_ptr spb{ spa };
	std::cout << spa.use_count() << std::endl; //2
	std::shared_ptr spc{ spa };
	std::cout << spa.use_count() << std::endl;  //3

结果:
在这里插入图片描述

2、unique()

简介:

原型: bool std::shared_ptr.unique();

说明: 若该shared_ptr是唯一的指向该区域的shared指针,返回true,否则返回false

代码:

	std::shared_ptr spa{ std::make_shared(50) }; 
	std::cout << spa.unique() << " "; //唯一
	std::shared_ptr spb{ spa }; 
	std::cout << spa.unique() << " "; //不唯一
	std::shared_ptr spc{ spa };
	std::cout << spa.unique() << " "; //不唯一

结果:
在这里插入图片描述

3、reset()

简介: 设置当前共享指针为nullptr,若是最后一个,则会释放内存

代码:

	std::shared_ptr spa{ std::make_shared(50) }; 
	std::shared_ptr spb{ spa };
	std::shared_ptr spc{ spa };
	spa.reset(); std::cout << spb << " "; //还没释放内存
	spb.reset(); std::cout << spc << " ";//还没释放内存
	spc.reset(); std::cout << spc << " ";//释放内存

结果:
在这里插入图片描述
再次感谢自己努力的拼搏!!老铁们觉得不错的点点赞哦!我是航行的土豆,谢谢!

你可能感兴趣的:(c++之独立和共享智能指针学习篇)