作为智能指针的一种,被设计出来最关键的目的就是解决原生指针安全性不足的问题
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 }; //初始化时指向第一个,直接报错,编译过不去
简介: 返回unique的原生指针!怎么理解?请看下面:
std::unique_ptr upa{ std::make_unique(20) };
int* pa = upa.get(); //定义一个原生指针接收它就可以了
std::cout << "pa=" << *pa << std::endl;
简介: 释放unique指针的内存空间,并且将指针指向nullptr(c++11及其以上)
举例如下:
std::unique_ptr upa{ std::make_unique(20) };
upa.reset(); //释放内存并且指向nullptr
std::cout << upa << std::endl;
简介: 返回原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;
简介: 为了解决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是转移到原生指针!
不同于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} };
简介: 返回当前地址有多少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
结果:
简介:
原型: 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() << " "; //不唯一
结果:
简介: 设置当前共享指针为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 << " ";//释放内存
结果:
再次感谢自己努力的拼搏!!老铁们觉得不错的点点赞哦!我是航行的土豆,谢谢!