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.hqwc.cn/news/345328.html

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

相关文章

ubuntu 20.04下 Tesla P100加速卡使用

1.系统环境&#xff1a;系统ubuntu 20.04, python 3.8 2.查看cuDNN/CUDA与tensorflow的版本关系如下&#xff1a; Build from source | TensorFlow 从上图可以看出&#xff0c;python3.8 对应的tensorflow/cuDNN/CUDA版本。 3.安装tensorflow #pip3 install tensorflow 新版…

MES生产执行系统在生产车间的主要作用

MES生产执行系统提供从生产订单下达到产品完成全流程的优化管理。实现现场设备、执行系统及管理系统的集成&#xff0c;实时监控生产管理各项绩效指标。 如果说ERP是上层决策&#xff0c;生产车间是下层执行&#xff0c;那么MES就是连接管理软件和一线生产的中间桥梁。 MES也…

gitee创建远程仓库并克隆远程仓库到电脑

1、首先点加号新建一个仓库 2、输入仓库名&#xff0c;路径会自动填充&#xff0c;填写简单的仓库介绍&#xff0c;先选择私有&#xff0c;在仓库创建之后&#xff0c;可以改为开源 3、打开建好的仓库 4、复制仓库链接 5、打开一个文件夹(想要存储远程仓库的地址)&#xff0c;在…

Mac M2芯片pycharm配置conda python环境

Mac M2芯片pycharm配置conda python环境 详细步骤如下 1、pycharm界面右上方的小齿轮⚙️&#xff0c;进入Setting…状态 2、进入setting界面后&#xff0c;选择左边栏的Project-->python Interpreter,然后选择右边的Add Interpreter 3、进入Add Interpreter后&#xff0c…

四种无监督聚类算法说明

目录 一、K-Means无监督学习&#xff08;K-Means&#xff09;的认识-CSDN博客​​​​​​ 二、Mini-Batch K-Means -- Centroid models 三、AffinityPropagation (Hierarchical) -- Connectivity models 四、Mean Shift -- Centroid models 无监督聚类是一种机器学习技术&…

11Spring IoC注解式开发(上)(元注解/声明Bean的注解/注解的使用/负责实例化Bean的注解)

注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发。 注解开发的优点:提高开发效率 注解开发的缺点:在一定程度上违背了OCP原则&#xff0c;使用注解的开发的前提是需求比较固定&#xff0c;变动较小。 1 注解的注解称为元注解 自定义一个注解: package com.sunspl…

Unity中的异步编程【7】——在一个异步方法里播放了animation动画,取消任务时,如何停止动画播放

用一个异步方法来播放一个动画&#xff0c;正常情况是&#xff1a;动画播放结束时&#xff0c;异步方法宣告结束。那如果我提前取消这个异步任务&#xff0c;那在这个异步方法里面&#xff0c;我要怎么停止播放呢&#xff1f;&#xff01; 一、播放animation动画的异步实现 1…

html+css+Jquery 实现 文本域 文字数量限制、根据输入字数自适应高度

先看效果&#xff1a;初始的效果&#xff0c;样式多少有点问题&#xff0c;不重要&#xff01;重要的是功能&#xff01; 输入后&#xff1a; 根据文字长度&#xff0c;决定文本域长度 限制文字数量 话不多说&#xff0c;直接上代码&#xff01; <!DOCTYPE html> <h…

特征工程-特征处理(一)

特征处理-&#xff08;离散型特征处理&#xff09; 完成特征理解和特征清洗之后&#xff0c;我们要进行特征工程中最为重要和复杂的一步了——特征处理 离散型特征处理 离散型特征通常为非连续值或以字符串形式存在的特征&#xff0c;离散型特征通常来讲是不能直接喂入模型中…

如何有效提高矢量网络分析仪的动态范围

动态范围是网络分析仪&#xff08;VNA&#xff09;接收机的最大输入功率与最小可测量功率&#xff08;本底噪声&#xff09;之间的差值&#xff0c;如图所示&#xff0c;要使测量有效&#xff0c;输入信号必须在这些边界内。 如果需要测量信号幅度非常大的变化&#xff0c;例如…

C程序训练:阶乘与溢出

已知n是整数&#xff0c;计算12!3!...n!&#xff0c;并给出最大能够计算的n值是多少&#xff1f; 1. 假设n是int类型&#xff0c;系统用32位表示int类型。代码如下&#xff1a; #include <stdio.h> int main() {int n,sum1,sum1,fact1;int step;for(n2; n<100; n) {…

UCB Data100:数据科学的原理和技巧:第二十一章到第二十六章

二十一、SQL II 原文&#xff1a;SQL II 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 学习成果 介绍过滤组的能力 在 SQL 中执行数据清理和文本操作 跨表连接数据 在本讲座中&#xff0c;我们将继续上次的工作&#xff0c;介绍一些高级的 SQL 语法。 首先&…