十三、指针和引用(三)

这篇具有很好参考价值的文章主要介绍了十三、指针和引用(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

十三、指针和引用(三)

1、std::unique_ptr(唯一智能指针)

1)概念

std::unique_ptr是所谓的智能指针的一种,主要目的是为了解决原生指针安全性不足的弊端

//std::unique_ptr指针的声明语法
std::unqiue_ptr<类型>变量名称{};

//示例
std::unique_ptr<int>ptrA{std::make_unique<int>(150)}; // 申请一个具有1个int类型大小的指针,值为150
std::cout<<*ptrA;  //指针使用

std::unique_ptr<int[]>ptrB{new int[5]}; //C++14之前的写法,申请一个具有5个int类型大小的指针
std::unique_ptr<int[]>ptrB{std::make_unique<int[]>(10)};   //申请一个具有5个int类型大小的指针
ptrB[0]=250;  //指针使用,此声明方法,只能通过数组访问

2)唯一智能指针特性

std::unique_ptr的特点是该指针具有唯一性,因此无法让两个std::unique_ptr指针存放相同的内存地址,如下:

std::unique_ptr<int>ptrA{std::make_unique<int>(150)};
std::unique_ptr<int>ptrB{};
//ptrA=ptrB;      //错误,无法直接赋值

十三、指针和引用(三)

#include <iostream>

int main()
{
	int* a = new int[5];
	std::unique_ptr<int[]>intptr{ std::make_unique<int[]>(5) };     //申请一个具有5个int类型大小的指针

	std::unique_ptr<int>intptrA{ std::make_unique<int>(5) };  // 申请一个具有1个int类型大小的指针,值为5

	std::cout << intptr << " " << intptr[0]<<std::endl;        //013D5C98 0
	std::cout << intptrA << " " << *intptrA << std::endl;      //013DEC10 5
}

十三、指针和引用(三)

3)reset()用法

​ reset将会释放std::unique_ptr的内存空间,并且将std::unique_ptr设置为nullptr;

//reset()用法示例
std::unique_ptr<int>ptrA{std::make_unique<int>(150)};
ptrA.reset();  //此时ptrA的内存空间被释放,ptrA的值设置成了nullptr
//reset()示例
#include <iostream>

int main()
{
	int* a = new int[5];
	delete[] a;        //释放new申请的内存空间

	std::unique_ptr<int>ptrA{ std::make_unique<int>(100) };
	std::cout << "释放内存前的地址:"<<ptrA << std::endl;
	ptrA.reset();           //释放唯一智能指针
	std::cout << "释放内存后的地址:" << ptrA << std::endl;
}

十三、指针和引用(三)

4)get()用法:返回一个std::unique_ptr的指针

//get()用法
std::unique_ptr<int>ptrA{std::make_unique<int>(150)};
int*p = ptrA.get();     //相当于将ptrA申请时的内存赋值给p

5)release()用法

relsease将会返回std::unique_ptr的指针,并且将std::unique_ptr设置为nullptr,但是注意release并不会释放其占用的内存空间

//relseae()用法
std::unique_ptr<int>ptrA{std::make_unique<int>(150)};
int* p = ptrA.release(); 
//此时ptrA占用的内存空间没有被释放,ptrA的值设置成了nullptr,p等于ptrA申请内存时的地址
//release只是将申请的内存地址设置为了0,并没有释放,并且将原理的地址进行了返回
#include <iostream>

int main()
{

	int* a = new int[5];
	std::unique_ptr<int>ptrA{ std::make_unique<int>(100) };
	std::cout << "release前的地址:" << ptrA << std::endl;
	a = ptrA.release();
	std::cout << "release后的地址:" << ptrA << std::endl;
	std::cout << "a的地址:" << a << std::endl;
}

十三、指针和引用(三)

6)唯一智能指针的转移(move)

​ std::unique_ptr指针因为具有唯一性,因此不能被复制,但是可以转移

//唯一智能指针转移语法
转移后的指针变量=std::move(转移前的指针变量);

//示例
std::unique_ptr<int>ptrA{std::make_unique<int>(150)};
std::unique_ptr<int>ptrB;
ptrB=std::move(ptrA);  //将ptrA的地址转移到ptrB,转移后ptrA被设置为nullptr

十三、指针和引用(三)

2、std::shared_per(共享智能指针)

1)共享智能指针语法

//共享智能指针语法
std::shared_ptr<类型>变量名称{};

//示例
std::shared_ptr<int>ptrA{};
std::shared_ptr<int>ptrB{std::make_shared<int>(5)};

//注:std::make_shared不支持新式的数组的定义方式,只能通过new的方式
std::shared_ptr<int[]>ptr{new int[5]{1,2,3,4,5}};
//共享智能指针的定义及使用
#include <iostream>

int main()
{
	int* a{};
	std::shared_ptr<int>ptrA{ std::make_shared<int>(5) };
	std::shared_ptr<int>ptrB{ ptrA };       //共享ptrA的内存地址
	std::shared_ptr<int>ptrC{ ptrA };

	std::cout << "ptrA的内存地址为:" << ptrA << std::endl;
	std::cout << "ptrB的内存地址为:" << ptrB << std::endl;
	std::cout << "ptrA的内存地址为:" << ptrC << std::endl;
	std::cout << "\n";
	std::cout << "ptrA的值为:" << *ptrA << std::endl;
	std::cout << "ptrB的值为:" << *ptrB << std::endl;
	
}

十三、指针和引用(三)

2)共享智能指针特性

​ 可以有多个std::shared_ptr指向同一地址,同一地址下只有当最后一个std::shared_ptr释放的时候,才会释放其占用的内存空间,std::shared_ptr会记录当前地址有多少个智能指针调用

3)统计共享指针当前有多少个对象调用(use_count)

//统计共享指针当前有多少个对象调用
long std::shared_ptr.use_count();  

.user_count();  //会返回当前指针共有多少个对象调用
//use.count()用法示例
#include <iostream>

int main()
{
	int* a{};
	std::shared_ptr<int>ptrA{ std::make_shared<int>(5) };
	std::shared_ptr<int>ptrB{ ptrA };       //共享ptrA的内存地址
	std::shared_ptr<int>ptrC{ ptrA };

	std::cout << "ptrA指针共有多少个指针调用:" << ptrA.use_count() << std::endl;

}

十三、指针和引用(三)

5)判断共享智能指针是否唯一(unique)

//判断共享智能指针是否唯一
bool std::shared_ptr.unique();
//unique()返回一个bool值,如果当前智能指针是唯一拥有该指针的,那么返回true,负责返回false
注:C++17标准无法使用该函数,只能在17之前使用
//unique()用法
#include <iostream>

int main()
{
	int* a{};
	std::shared_ptr<int>ptrA{ std::make_shared<int>(5) };
	std::cout << "判断指针指针ptrA是否唯一:" << ptrA.unique() << std::endl;
	std::shared_ptr<int>ptrB{ ptrA };       //共享ptrA的内存地址
	std::shared_ptr<int>ptrC{ ptrA };
	std::cout << "判断指针指针ptrA是否唯一:" << ptrA.unique() << std::endl;
}

十三、指针和引用(三)

4)共享智能指针的释放

​ reset()会将当前共享指针设置为nullptr,同时如果当前智能指针是最后一个拥有该指针的对象,那么将会释放内存。只有最后一个指针变量释放,才能释放内存空间

//共享智能指针的释放
std::shared_ptr.reset();
//reset()使用
#include <iostream>

int main()
{
	int* a{};
	std::shared_ptr<int>ptrA{ std::make_shared<int>(5) };
	std::shared_ptr<int>ptrB{ ptrA };       //共享ptrA的内存地址
	std::shared_ptr<int>ptrC{ ptrA };

	ptrB.reset();                   //只是修改指针的指向,并不释放指针内存地址
	std::cout << ptrB << std::endl;
	ptrA.reset();
	std::cout << ptrA << std::endl;
	std::cout << ptrC << std::endl;
	ptrC.reset();                  //释放智能指针的内存地址
	std::cout << ptrC << std::endl;
}

十三、指针和引用(三)文章来源地址https://www.toymoban.com/news/detail-746812.html

到了这里,关于十三、指针和引用(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++中智能指针(unique_ptr、shared_ptr、weak_ptr)详解

    C++中的智能指针是一种 RAII(资源获取即初始化)机制的实现, 它可以在对象不再需要时自动释放相关资源。 智能指针通过封装指针对象并提供一些额外的功能,如 引用计数、自动内存管理、避免内存泄漏等, 使得指针使用更加安全和方便。 在C++中,有三种主要类型的智能

    2023年04月11日
    浏览(39)
  • C++11中的智能指针unique_ptr、shared_ptr和weak_ptr详解

    目录 1、引言 2、什么是智能指针? 3、在Visual Studio中查看智能指针的源码实现 4、独占式指针unique_ptr 4.1、查看unique_ptr的源码实现片段 4.2、为什么unique_ptr的拷贝构造函数和复制函数被delete了?(面试题) 4.3、使用unique_ptr独占式智能指针的实例 5、共享式指针shared_ptr  5.1、查

    2024年02月08日
    浏览(42)
  • C++11 新特性 ⑥ | 智能指针 unique_ptr、shared_ptr 和 weak_ptr

    目录 1、引言 2、unique_ptr 3、shared_ptr 4、weak_ptr 5、shared_ptr循环引用问题(面试题)

    2024年02月09日
    浏览(47)
  • 【C++入门到精通】智能指针 auto_ptr、unique_ptr简介及C++模拟实现 [ C++入门 ]

    在 C++ 中,智能指针是一种非常重要的概念,它能够帮助我们自动管理动态分配的内存,避免出现内存泄漏等问题。在上一篇文章中,我们了解了智能指针的基本概念和原理, 本篇文章将继续介绍 auto_ptr 和 unique_ptr 两种智能指针的概念及其在 C++ 中的模拟实现 。通过学习这些

    2024年01月19日
    浏览(61)
  • 指针的指针 ok, 引用的引用 no ---- 理解引用折叠

           我们都知道,在C/C++中,出现指针的指针,也就是二级指针的场景是合法的,甚至可以是更多级的指针,都是ok的;但是如果出现了引用的引用,那绝对是非法操作,任何一款C/C++的编译器都很乐意为您检测出此类非法操作。既然会讨论这个问题,说明 引用的引用 这样

    2024年02月07日
    浏览(34)
  • C++【4】指针与引用;数组指针;指针数组

    /*     指针变量作为函数参数         函数的参数可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中。         指针变量作为函数参数与变量本身作为函数参数不同,变量作函数参数传递的是具体值。         而指针作为函数参数传递的是内存的地址

    2024年02月07日
    浏览(35)
  • 【C++】C++ 引用详解 ⑦ ( 指针的引用 )

    指针的引用 效果 等同于 二级指针 , 因此这里先介绍 二级指针 ; 使用 二级指针 作为参数 , 可以实现如下功能 : 动态内存管理 : 借助二级指针 , 可以在函数中分配或释放内存 ; 如 : 创建一个动态数组或调整现有数组的大小 , 在函数中需要一个指向指针的指针作为参数 , 以便修

    2024年02月11日
    浏览(37)
  • C语言指针操作(三)通过指针引用数组

    通过指针引用数组的几种方法的原理和差异;以及利用指针引用数组元素的技巧 关于地址,指针,指针变量可以参考这篇文章: C语言指针操作(一)地址,指针,指针变量是什么 关于指针变量作为函数参数可以参考这篇文章: C语言指针操作(二)指针变量作为函数参数

    2024年02月04日
    浏览(48)
  • C语言指针操作(五)通过指针引用多维数组

    多维数组的地址,通过指针引用多维数组详解。 通过指针引用一维数组可以参考这篇文章: C语言指针操作(三)通过指针引用数组 目录 一、多维数组的地址 1.1引入 1.2地址举例说明 1.3地址类型详解 1.4实例说明 二、指向多维数组元素的指针变量 2.1指向数组元素的指针变量

    2024年02月03日
    浏览(45)
  • C语言指针操作(七)通过指针引用字符串

    通过指针引用字符串详解,以及字符指针变量和字符数组的比较、 在平常的案例中已大量地使用了字符串,如在 printf函数中输出一个字符串。这些字符串都是以直接形式 (字面形式) 给出的,在一对双引号中包含若干个合法的字符。在本节中将介绍使用字符串的更加灵活方便

    2024年02月03日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包