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

unique_ptr 智能指针篇

简介:

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

声明语法:

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

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

举例如下:

第一种:

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

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

第二种:

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

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

重要特性:

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

来个错误的例子:

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

常用方法:

1、get()

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

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

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

2、reset()

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

举例如下:

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

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

3、release()

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

举例如下:

	std::unique_ptr<int> upa{ std::make_unique<int>(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<int> upa{ std::make_unique<int>(20) };
	std::unique_ptr<int> 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<int> spa{ std::make_shared<int>(50) }; 
	
	//第二种  这种方法不行,用第三种替换
	//std::shared_ptr<int[]> spb{ std::make_shared<int[]>(4) };
	
	//第三种 //用new申请数组形式替代即可
	std::shared_ptr<int[]> spc{ new int[4]{1,2,3,4} };

常用方法:

1、use_count()

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

代码:

	std::shared_ptr<int> spa{ std::make_shared<int>(50) }; 
	std::cout << spa.use_count() << std::endl;   //1
	std::shared_ptr<int> spb{ spa };
	std::cout << spa.use_count() << std::endl; //2
	std::shared_ptr<int> 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<int> spa{ std::make_shared<int>(50) }; 
	std::cout << spa.unique() << " "; //唯一
	std::shared_ptr<int> spb{ spa }; 
	std::cout << spa.unique() << " "; //不唯一
	std::shared_ptr<int> spc{ spa };
	std::cout << spa.unique() << " "; //不唯一

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

3、reset()

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

代码:

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

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

C++中,auto_ptr和共享智能指针(如std::shared_ptr)以及独立指针之间有一些区别。 auto_ptr是一个已经被废弃的C++标准库类。它是一种智能指针,用于管理动态分配的内存,并确保在其生命周期结束时正确释放该内存。auto_ptr具有独占所有权,这意味着它只能有一个指针指向它所管理的对象。当auto_ptr被复制或移动时,它会将其指向的对象的所有权转移给新的auto_ptr,原来的auto_ptr则变成nullptr。auto_ptr虽然可以确保内存的正确释放,但是由于其复制和移动的语义可能会导致程序出现难以调试的bug,因此已经被C++11标准废弃,建议使用unique_ptr代替auto_ptr。 共享智能指针(如std::shared_ptr)是一种智能指针,用于管理动态分配的内存,并确保在其生命周期结束时正确释放该内存。与auto_ptr不同,shared_ptr可以共享所有权,这意味着可以有多个shared_ptr指向同一个对象。shared_ptr使用引用计数来跟踪有多少个shared_ptr指向同一个对象,并在没有任何shared_ptr指向该对象时释放该对象的内存。shared_ptr的复制和移动语义比较清晰,因此相对安全。 独立指针是一种传统的指针类型,它不具有智能指针的功能。独立指针需要手动分配和释放内存,并且容易出现内存泄漏和野指针等问题。虽然独立指针没有智能指针那么方便,但在某些情况下,它们仍然是必需的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值