C++——智能指针

embedded/2024/11/17 5:27:42/

前言:哈喽小伙伴们,今天我们继续来分享C++的一个全新知识——智能指针。


目录

一.何为智能指针

 RAII

 二.智能指针的种类

三.内存泄漏

结语


一.何为智能指针

 RAII

RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。
在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:

  • 不需要显式地释放资源。
  • 采用这种方式,对象所需的资源在其生命期内始终保持有效。

借由RAII的思想,我们引出智能指针

template<class T>
class SmartPtr {
public:SmartPtr(T* ptr = nullptr): _ptr(ptr){}~SmartPtr(){if(_ptr)delete _ptr;}
private:T* _ptr;
};
void Func()
{SmartPtr<int> sp1(new int);SmartPtr<int> sp2(new int);cout << div() << endl;
}

 所谓智能指针,就是通过一个类来控制指针对象的存亡,通过这种方式创建的对象,只要函数退出,就会自动执行其析构函数


 二.智能指针的种类

上述我们所实现的,只是智能指针的基础部分,那么在C++的库中,是包含很多种智能指针的:

  • auto_ptr
  • unique_ptr
  • shared_ptr

这三种智能指针,在智能指针之间的拷贝赋值中有所区别

auto_ptr指针如果进行拷贝,是通过转移管理权的思想,也可以理解为移动构造,直接争夺资源,但是并不会造成原指针的销毁,而是置空。

unique_ptr指针简单粗暴,直接就是禁止进行拷贝。

能够看出,上述两种智能指针,都不允许指针之间进行数据共享,而shared_ptr却可以: 

shared_ptr的原理:是通过引用计数的方式来实现多个shared_ptr对象之间共享资源。

其具体实现方式为:

  1. shared_ptr在其内部,给每个资源都维护了着一份计数,用来记录该份资源被几个对象共享。
  2. 在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象的引用计数减一
  3. 如果引用计数是0,就说明自己是最后一个使用该资源的对象,必须释放该资源;
  4. 如果不是0,就说明除了自己还有其他对象在使用该份资源,不能释放该资源,否则其他对象就成野指针了。

 再日常使用中,shared_ptr是最常用也是最推荐的智能指针。


三.内存泄漏

那么我们设计智能指针的目的,就是为了防止发生内存泄漏

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。


结语

关于智能指针就分享这么多,喜欢本篇文章记得一键三连,我们下期再见!


http://www.ppmy.cn/embedded/90825.html

相关文章

电影票房数据的获取,可以控制数量,并导出表格或csv

#本文仅供学习交流之用 import json import requests import pandas as pdheaders {Accept: application/json, text/plain, */*,Accept-Language: zh-CN,zh;q0.9,Cache-Control: no-cache,Connection: keep-alive,Content-Type: application/x-www-form-urlencoded,Origin: h…

Stable Diffusion绘画 | 图生图-基础使用介绍—重绘幅度与缩放模式

重绘幅度 重绘幅度越大&#xff0c;出图与原图差异越大。 重绘幅度0.7 重绘幅度0.3 缩放模式 目前有以下四种缩放模式&#xff1a; 原图的宽高是1080x1440&#xff0c;当修改宽高&#xff0c;与原图不一致时&#xff0c;可选择其中一种缩放模式来处理图片。 仅调整大小 缩放…

基于Matlab的疲劳检测系统设计与实现

基于Matlab的疲劳检测系统设计与实现 一、引言 1. 阐述疲劳驾驶的危害性及对交通安全的影响。 2. 强调疲劳检测系统的重要性和现实意义。 3. 介绍本文的主题&#xff1a;基于Matlab的疲劳检测系统设计与实现。 二、系统设计 1. 系统总体架构设计 t- 输入模块&#xff1a;负…

javaEE和javaSE

引用自&#xff1a;https://developer.baidu.com/article/detail.html?id3312755 文章目录 前景描述javaSE简介使用场景 javaEE&#xff08;J2EE&#xff09;简介使用场景 结语 前景描述 javaEE和javaSE是java中比较常见的两个概念,但是又比较容易忘记&#xff0c;在此进行记…

科普文:JUC系列之Java中7种阻塞队列BlockingQueue的双锁源码解读

概叙 Queue接口与List、Set同一级别&#xff0c;都是继承了Collection接口**。队列是一种数据结构&#xff0e;它有两个基本操作&#xff1a;在队列尾部加人一个元素&#xff0c;和从队列头部移除一个元素&#xff0c;队列以一种先进先出的方式管理数据。 队列分为两种&#x…

如何判断机器学习模型的好坏之回归模型

1. 回归模型的性能指标 均方误差(Mean Squared Error, MSE) 均方误差是预测值与实际值之间差值的平方和的平均数,用于衡量模型预测的平均误差。公式如下: [ MSE = 1 n ∑ i = 1 n ( y i − y ^ i )

Android Gradle开发与应用技术原理

Android Gradle开发与应用技术原理 Android Gradle开发与应用技术原理一、概述二、Gradle构建原理1. Gradle架构2. Gradle构建过程3. 构建脚本 三、Gradle插件机制四、在Android应用中实现Text-to-Speech&#xff08;TTS&#xff09;功能1. 配置Gradle依赖2. 实现TTS功能示例代…

网络安全(黑客)—自学手册

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防…