c++学习:智能指针的底层作用原理+用法

目录

智能指针作用原理

作用

原理

模仿int*类型的智能指针

模仿所有类型的智能指针(模板)

共享智能指针类

思考;如果多个智能指针同时指向同一个堆空间,怎么只执行一次析构函数进行释放空间   (共享智能指针类)

独占式智能指针

c++提供的标准智能指针

头文件

标准智能指针模板类的成员类型和成员函数

用法


智能指针作用原理

如果分配了一个内存空间,但后面又忘记释放空间,会造成内存泄漏,智能指针就可以自动释放空间,避免内存泄漏。

智能指针是一个RAII类模型,用于动态分配内存,其设计思想是将基本类型指针封装为(模板)类对象指针,并在离开作用域时调用析构函数,使用delete删除指针所指向的内存空间。

作用

能够处理内存泄漏问题和空悬指针问题

原理

像类一样,有构造函数和析构函数,当申请的时候就是构造函数,当不用了,就自动运行析构函数来释放空间

模仿int*类型的智能指针

class shared_ptr
{
public://等价于int *p = new int(100)shared_ptr(int*p):ptr(p){}~shared_ptr(){cout<<__FUNCTION__<<endl;if(this->ptr != NULL){delete this->ptr;}}int*get(){return this->ptr;}
private:int*ptr;
};void test()
{//正常申请内存空间int *p = new int(100);*p = 200;cout<<*p<<endl;delete p;//模仿智能指针申请内存空间shared_ptr p1(new int(100));*(p1.get()) = 200;cout<<*(p1.get())<<endl;
}

模仿所有类型的智能指针(模板)

template<class T>
class shared_ptr
{
public://int *p = new int(100)shared_ptr(T*p):ptr(p){}~shared_ptr(){cout<<__FUNCTION__<<endl;if(this->ptr != NULL){delete this->ptr;}}T*get(){return this->ptr;}
private:T*ptr;
};//例子 :申请一个类的智能指针
class Demo
{
public:Demo(){cout<<"Demo()"<<endl;}~Demo(){cout<<"~Demo()"<<endl;}
private:int data;
};void test01()
{shared_ptr<Demo> p1(new Demo);
}

共享智能指针类

思考;如果多个智能指针同时指向同一个堆空间,怎么只执行一次析构函数进行释放空间   (共享智能指针类)

解决办法:每当有一个智能指针指向一个堆空间,就记录一次,当有第二个智能指针指向该空间,就+1,每当一个智能指针执行析构函数的时候就-1,判断是否是最后一个指向该空间的智能指针再决定释放空间 

template<class T>
class shared_ptr
{
public://int *p = new int(100)shared_ptr(T*p):ptr(p){}shared_ptr(shared_ptr &ra){ptr = ra.ptr;count++;}~shared_ptr(){cout<<__FUNCTION__<<endl;if(this->ptr != NULL && --count == 0){//最后一个对象被销毁的时候,才执行里面的代码delete this->ptr;this->ptr = NULL;cout<<"count == 0"<<endl;}}T*get(){return this->ptr;}
private:T*ptr;static int count;//要在类外定义初始化
};template<class T>
int shared_ptr<T>::count=0;class Demo
{
public:Demo(){cout<<"Demo()"<<endl;}~Demo(){cout<<"~Demo()"<<endl;}void setData(int d){data = d;}
private:int data;
};void test01()
{//多个智能指针类的对象可以管理 同一个堆空间shared_ptr<Demo> p2(new Demo);shared_ptr<Demo> p3(p2);shared_ptr<Demo> p4(p3);shared_ptr<Demo> p5(p4);p2.get()->setData(100);
}

独占式智能指针

 如果是独占式智能指针,shared_ptr<Demo> p3(p2);这种写法会报错,因为智能有一个智能指针指向该堆空间

template<class T>
class unique_ptr
{//方法1:将拷贝构造函数声明为私有,外面的无法调用//unique_ptr(unique_ptr &ra);
public:unique_ptr(T*p):ptr(p){}//方法2:在拷贝构造函数的声明后面加上delete关键字 ,表示这个函数不能被调用unique_ptr(unique_ptr &ra) = delete;~unique_ptr(){cout<<__FUNCTION__<<endl;if(this->ptr != NULL){delete this->ptr;this->ptr = NULL;}}T*get(){return this->ptr;}
private:T*ptr;static int count;//要在类外定义初始化
};

c++提供的标准智能指针

头文件

#include <memory> 

标准智能指针模板类的成员类型和成员函数

std::shared_ptr - cppreference.comicon-default.png?t=N7T8https://zh.cppreference.com/w/cpp/memory/shared_ptr

用法

#include <iostream>
#include <memory> //C++智能指针类的头文件using namespace std;int main()
{shared_ptr<int> ptr1(new int(120));*(ptr1.get()) = 1000;unique_ptr<char> ptr2(new char);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/609661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在VS Code中安装Copilot与安装其他扩展的方法一样,只需简单几步

GitHub Copilot是由OpenAI和GitHub开发的人工智能工具。它的目的是通过自动完成代码来帮助开发人员使用集成开发环境&#xff08;IDE&#xff09;&#xff0c;如Visual Studio Code。它目前仅作为技术预览版提供&#xff0c;因此只有在候补名单上被认可的用户才能访问它。对于用…

Redis:原理速成+项目实战——Redis实战8(基于Redis的分布式锁及优化)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战7&#xff08;优惠券秒杀细节解决超卖、一人一单问题&#xff09; &#x1f4d…

Spark与Cassandra的集成与数据存储

Apache Spark和Apache Cassandra是大数据领域中两个重要的工具&#xff0c;用于数据处理和分布式数据存储。本文将深入探讨如何在Spark中集成Cassandra&#xff0c;并演示如何将Spark数据存储到Cassandra中。将提供丰富的示例代码&#xff0c;以帮助大家更好地理解这一集成过程…

Nginx配置反向代理实例一

Mac 安装Nginx教程 提醒一下&#xff1a;下面实例讲解是在Mac系统演示的&#xff1b; 反向代理实例一实现的效果 在浏览器地址栏输入www.testproxy.com, 跳转到系统Tomcat主页面。 反向代理准备工作 第一步&#xff1a;在系统的 hosts 文件进行ip和域名对应关系的配置。 …

【办公类-19-01】20240108图书统计登记表制作(23个班级)EXCEL复制表格并合并表格

背景需求&#xff1a; 制作一个EXCEL模板&#xff0c;每个班级的班主任统计 班级图书量&#xff08;一个孩子10本&#xff0c;最多35个孩子350本&#xff09; EXCEL模板 1.0版本&#xff1a; 将这个模板制作N份——每班一份 项目:班级图书统计表 核心:一个EXCEL模板批量生成…

Android block quick OnClick event,simple implement,Kotlin

Android block quick OnClick event&#xff0c;simple implement&#xff0c;Kotlin var time 0Lview?.setOnClickListener {val now System.currentTimeMillis()if (now - time > 300) {Log.d("fly", "正常点击")} else {Log.d("fly", &…

Android BUG 之 Error: Activity class {} does not exist

项目场景&#xff1a; 更换包名&#xff0c;运行报错 问题描述 原因分析&#xff1a; 在替换包名的时候要确认&#xff0c;配置文件跟build中的保持一致&#xff0c;在更换后还要将旧包的缓存数据清理掉 解决方案&#xff1a; 1 替换后删除 app 下的build 文件夹 2 Rebuild Pr…

Python-抖音无法拒绝的表白代码【附源码】

一个无法被拒绝的表白代码 运行效果&#xff1a; 一&#xff1a;主程序&#xff1a; import sys import cfg import random import pygame from tkinter import Tk, messagebox Function:按钮类 Initial Args:--x, y: 按钮左上角坐标--width, height: 按钮宽高--text: 按钮显…

gem5学习(10):创建一个简单的配置脚本——Creating a simple configuration script

目录 一、gem5 configuration scripts 1、An aside on SimObjects 二、Creating a config file 1、导入m5库和SimObjects 2、创建模拟系统 3、设置系统时钟 4、设置内存模拟方式 5、创建CPU 6、创建系统级内存总线 7、连接请求-响应端口 &#xff08;1&#xff09;A…

【项目管理】CMMI-风险与机会管理过程

1、文档结构 2、风险与机会概率 风险与机会概率指的是风险与机会实际发生的可能性。可以用自然语言术语来映射数字概率范围。下表列出了七段概率分级中自然语言术语和数字概率范围映射关系。注意&#xff0c;用来计算的概率值等于概率范围的中间值取整。有了映射表格的帮助&am…

计算机视觉技术-区域卷积神经网络(R-CNN)

区域卷积神经网络&#xff08;region-based CNN或regions with CNN features&#xff0c;R-CNN&#xff09; (Girshick et al., 2014)也是将深度模型应用于目标检测的开创性工作之一。 本节将介绍R-CNN及其一系列改进方法&#xff1a;快速的R-CNN&#xff08;Fast R-CNN&#x…

Unity之摄像机

一、摄像机类型 1.1 透视摄像机 透视摄像机有近大远小的效果&#xff0c;与我们在现实中看到的效果相同。所以当两个同样大小的物体到摄像机的距离不同时我们看到的大小也会不同。Unity的3D项目中默认使用的就是透视摄像机。 1.2 正交摄像机 正交摄像机没有近大远小的效果&am…

在 Flutter 中创建圆角图像和圆形图像有多少种方法?

使用 Container 、 ClipRRect 、 CircleAvatar 、 Card 和 PhysicalModel 实现具有视觉吸引力的图像效果。 在 Flutter 应用 UI 设计中&#xff0c;圆形图像是常见的视觉元素。本博客探讨了使用不同技术实现圆形图像效果的各种方法。无论是使用网络图像、本地文件还是资源&…

【MYSQL】MYSQL 的学习教程(十三)之 MySQL的加锁规则

1. MySQL 加锁全局视角 MySQL 分成了 Server 层和存储引擎两部分&#xff0c;每当执行一个查询时&#xff0c;Server 层负责生成执行计划&#xff0c;然后交给存储引擎去执行。其整个过程可以这样描述&#xff1a; Server 层向 Innodb 获取到扫描区间的第 1 条记录Innodb 通过…

从网页连接socket服务器和I/O

1.i/o InputStream和InputStreamReader是Java I/O类库中的两个关键类&#xff0c;用于处理字节流。它们的主要区别在于它们处理数据的方式。 InputStream: InputStream是用于读取字节流的抽象类。它是所有字节输入流类的父类。InputStream的子类可以从不同的数据源读取字节&…

rime中州韵小狼毫 随机数 随机码 电脑信息 滤镜

在输入法中支持生成GUID&#xff0c;或者随机数&#xff0c;随机字符&#xff0c;获取自身电脑信息&#xff0c;这将是一个非常酷的功能。 先睹为快 本文所分享滤镜&#xff0c;主要用于生成一些动态的信息词条&#xff0c;效果如下&#x1f447;&#xff1a; GUID.lua GU…

如何正确地理解应用架构并开发

许多同学或多或少都经历过这样的流程&#xff1a; 新同学刚来公司&#xff0c;学习了解团队的一些工程代码&#xff0c;并了解其中的代码风格团队新接手了一些其他团队的项目&#xff0c;需要了解工程结构以及概念如何定义工程项目的工程结构&#xff0c;包目录结构并达成团队共…

抖音矩阵云混剪系统源码 短视频矩阵营销系统V2.2.1(免授权版)

抖音矩阵云混剪系统源码 短视频矩阵营销系统V2.2.1&#xff08;免授权版&#xff09; 中网智达矩阵营销系统多平台多账号一站式管理&#xff0c;一键发布作品。智能标题&#xff0c;关键词优化&#xff0c;排名查询&#xff0c;混剪生成原创视频&#xff0c;账号分组&#xff…

Redis主从复制、哨兵及集群

目录 简介 主从复制 哨兵 集群 1.Redis 主从复制 主从复制的作用 主从工作原理 主从复制搭建 安装redis 修改redis配置文件Master节点操作 修改 Redis 配置文件slave节点操作 验证主从效果 2.Redis 哨兵模式 哨兵模式的作用 哨兵结构组成部分 故障转移机制 主…

API(Math类,System类,Runtime类,Object类,Objects类,BigInteger类,BigDecimal类)

文章目录 课程目标1 Math类1.1 概述1.2 常见方法1.3 算法小题(质数)1.4 算法小题(自幂数)1.5 课后练习 2 System类2.1 概述2.2 常见方法 3 Runtime3.1 概述3.2 常见方法3.3 恶搞好基友 4 Object类4.1 概述4.2 常见方法 5 Objects类5.1 概述5.2 常见方法 6 BigInteger类6.1 引入…