当前位置: 首页 > news >正文

C++11智能指针简述

一、实现原理

        在智能指针对象中有一个裸指针,此指针存储的是动态创建对象的地址,用于生存期控制,能够确保智能指针对象离开所在作用域时,自动正确地销毁动态创建的对象,防止内存泄漏。

使用裸指针存在的问题:

(1)难以区分指针指向的是单个对象还是一组对象。

(2)使用完指针之后无法判断是否应该销毁指针,因为无法判断指针是否拥有指向的对象。

(3)在已经确定需要销毁指针的情况下,也无法确定是用delete关键字删除,还是有其他特殊的销毁机制。

二、auto_ptr

在C98标准中没有右值引用,也没有move,forward语义。

1、构造函数与析构函数

 auto_ptr在构造时获取对某个对象的所有权,在析构时释放该对象。

2、拷贝构造与赋值

C98还没有加入右值引用,也没有move语义。

auto_ptr的拷贝构造和赋值重载陷入困境:

1、浅拷贝和浅赋值,指针重复释放。

2、深拷贝和深复制,语义矛盾。

        auto_ptr要求其对裸指针的完全占有性。也就是说一个裸指针不能同时被两个以上的auto_ptr所拥有。那么在拷贝构造或赋值操作时,我们必须作特殊的处理来保证这个特性。auto_ptr的做法是所有权转移,即拷贝构造或赋值的原对象将失去对裸指针的所有权,所以,与一般拷贝构造函数,赋值函数不同,auto_ptr的拷贝构造函数,赋值函数的参数为引用而不是常引用。

        当然,一个auto_ptr也不能同时拥有两个以上的裸指针,所以,拷贝或赋值的目标对象将先释放其原来所拥有的对象。

3、总结

auto_ptr主要有三大问题:

(1)复制和赋值会改变资源的所有权,不符合人的直觉。

(2)在STL容器中使用auto_ptr存在重大风险,因为容器内的元素必需支持可复制和可赋值。

(3)不支持对象数组的操作。

三、unique_ptr

1、unique_ptr分析和使用

        unique_ptr是独占对象所有权语义的智能指针。

        unique_ptr实现了独享被管理对象指针的概念,这意味着它可确保一个对象和其对应的资源同一时间只被一个unique_ptr对象拥有。一旦拥有者被销毁或者编程empty或者开始拥有另一个对象的地址,先前拥有的那个对象就会被销毁,其任何相应资源亦会被释放。

2、特点

 (1)基于排他所有权模式:两个指针不能指向同一个资源。

 (2)由于独占对象的拥有权,所以不提供拷贝构造函数和左值赋值函数重载。

 (3)提供移动构造和移动赋值函数。

 (4)为了实现单个对象和一组对象的管理,添加了删除器类型。

四、shared_ptr

1、shared_ptr分析和使用

        shared_ptr实现了共享所有权方式来管理资源对象,这意味没有一个特定的shared_ptr拥有资源对象。相反,这些指向同一个资源对象的shared_ptr相互协作来确保资源对象在不需要的时候被析构。

2、特点

(1)基于共享所有权模式:多个指针能够同时指向同一个资源。

(2)基于共享所有权,使用引用计数控制块管理资源对象的生命期。

(3)提供拷贝构造函数和赋值重载函数;提供移动构造和移动赋值函数。

(4)为了实现单个对象和一组对象的管理,添加了删除器类型。

3、引用计数器的作用

(1)当新的shared_ptr对象与资源对象的地址关联时,则在其构造函数中,将与此资源对象关联的引用计数加1.

(2)当任何shared_ptr对象超出作用域时,则在其析构函数中,将与资源对象关联的引用计数减1.如果引用计数变为0,则表示没有其他shared_ptr对象与此资源对象关联,在这种情况下,它使用deleter删除器删除该资源对象。

五、weak_ptr

1、weak_ptr分析和使用

        弱引用指引weak_ptr是用来监视shared_ptr的生命周期,是shared_ptr的一个助手。weak_ptr没有重载操作符*和->,因为它不与shared_ptr共享指针,不能操作资源,主要是通过shared_ptr获得资源的检测权,它的构造不会增加引用计数,它的析构也不会减少引用计数,纯粹只是作为一个旁观者来监视shared_ptr中管理的资源是否存在。weak_ptr还可以用来返回this指针和解决循环引用的问题。

2、weak_ptr构建

        当我们创建一个weak_ptr时,需要用一个shared_ptr实例来初始化weak_ptr,由于是弱共享,weak_ptr的创建并不会影响shared_ptr的引用计数值。可以通过use_count()方法来获得观测资源的引用计数。

3、通过expired()方法来判断所观测的资源是否已经被释放

4、通过lock()方法来获取所监视的shared_ptr

        weak_ptr并没有重载operator->和operator*操作符,因此不可直接通过weak_ptr使用对象,典型的用法是调用其lock函数来获得shared_ptr实例,进而访问对象。

相关文章:

C++11智能指针简述

一、实现原理 在智能指针对象中有一个裸指针,此指针存储的是动态创建对象的地址,用于生存期控制,能够确保智能指针对象离开所在作用域时,自动正确地销毁动态创建的对象,防止内存泄漏。 使用裸指针存在的问题&#xff…...

【spring boot 实现图片验证码 前后端】

导入hutool依赖 <!--hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.36</version>获取验证码接口 Autowiredprivate Captcha captcha;private final static Long VALIDA…...

QT中读取QSetting文件

1.ini文件的格式 头文件 #include <QSettings> #include <QStringList> #include <QtCore> #include <QDebug>2.读文件 //ini文件的读取 void iniTest::readIniFile(QString filePath) {//1.打开ini文件QSettings m_iniFile(filePath, QSettings::I…...

网络安全 --- 基于网络安全的 Linux 最敏感目录及文件利用指南

目录 基于网络安全的 Linux 最敏感目录及文件利用指南 Linux 中最敏感的目录及文件 1. /etc 2. /root 3. /var/log 4. /proc 5. /tmp 6. /home 7. /boot 8. /dev 如何利用这些敏感文件 你可能没想到的知识点 总结 Linux 中最敏感的目录及文件 1. /etc 存放内容&a…...

操作系统八股文整理(一)

操作系统八股文整理 一、进程和线程的区别二、进程与线程的切换过程一、进程切换进程切换的步骤&#xff1a; 二、线程切换线程切换的步骤&#xff1a; 三、进程切换与线程切换的对比四、上下文切换的优化 三、系统调用一、系统调用的触发二、从用户空间切换到内核空间三、执行…...

ssh转发笔记

工作中又学到了&#xff0c;大脑转不过来 现有主机A&#xff0c;主机B&#xff0c;主机C A能访问B&#xff0c;B能访问C&#xff0c;A不能访问C C上80端口有个服务&#xff0c;现在A想访问这个服务&#xff0c;领导让用ssh转发&#xff0c;研究半天没找到理想的语句&#xf…...

[从零开始学SSM] Bean的配置

bean基础配置 bean别名配置 bean的作用范围配置 由运行结果可知&#xff0c;Spring创建的bean默认是单例的 那么如果我想创建非单例的bean怎么办&#xff0c;这时候就需要用到配置的方式完成了&#xff1a;在<bean>的属性中添加一个scope属性&#xff0c;该属性默认是si…...

CML(Current Mode Logic)电平详解

一、CML的定义与核心特性 CML&#xff08;Current Mode Logic&#xff0c;电流模式逻辑&#xff09; 是一种基于 电流驱动 的高速差分信号标准&#xff0c;专为 10Gbps以上超高速传输 设计。其核心原理是通过恒定的尾电流源切换电流路径&#xff0c;生成低摆幅差分信号&#x…...

【链表世界的深度探索:从基础到高阶的算法解读】—— LeetCode

文章目录 反转链表链表的中间结点合并两个有序链表相交链表两数相加两两交换链表中的节点重排链表合并K个升序链表K个一组翻转链表 反转链表 这道题目的意思很好理解&#xff0c;即将链表给反转即可 方法一&#xff1a; 利用双指针进行操作&#xff0c;定义两个变量 prev 以及…...

JMeter 性能测试

Jmeter 用户手册 名词解释&#xff1a; RPS&#xff1a;每秒请求数-每秒向服务器发送多少请求数&#xff08;一个场景&#xff0c;系统面临多大的压力&#xff09; TPS&#xff1a;每秒事务数-每秒能够处理多少请求/事务数性能评价标准&#xff08;其中的一个核心指标&#x…...

LCR 159. 库存管理 III

这道题虽然简单&#xff0c;但是可以有多种解法&#xff0c;适合练习各种解法。 可以用基于快速排序思想的快速选择算法&#xff1a; class Solution { public:vector<int> inventoryManagement(vector<int>& stock, int cnt) {vector<int> res;int le…...

Spring IOC(五个类注解)

controller、service、Repository、Component 、Configurationpackage com.java.ioc;import com.java.ioc.Controller.HelloController; import com.java.ioc.rep.UserRepository; import com.java.ioc.service.UserService; import org.springframework.boot.SpringApplicatio…...

JavaScript 中的包装类型:概念、作用与使用场景

文章目录 引言1. 什么是包装类型&#xff1f;1.1 包装类型的定义1.2 包装类型的作用 2. 包装类型的使用2.1 自动装箱&#xff08;Autoboxing&#xff09;示例 2.2 手动创建包装对象示例 3. 包装类型的特性3.1 包装对象的生命周期示例 3.2 基本类型与包装对象的区别示例 4. 包装…...

Linux 如何上传本地文件以及下载文件到本地命令总结

如果你希望在 Shell 终端中将远程服务器上的文件下载到本地电脑&#xff0c;可以使用以下工具和命令&#xff1a; 1. rz / sz&#xff08;用于 Xshell、MobaXterm 等终端&#xff09; 如果你使用的是Xshell、SecureCRT、MobaXterm等支持 rz/sz 的终端&#xff0c;可以使用 rz …...

CentOS 上扩展 Swap 分区的大小

在 CentOS 上扩展 Swap 分区的大小可以通过以下几种方式实现&#xff1a; 方法 1&#xff1a;增加 Swap 文件&#xff08;推荐&#xff09; 如果你的 Swap 是基于文件的&#xff08;而不是分区&#xff09;&#xff0c;你可以增加 Swap 文件的大小&#xff0c;而不需要修改磁盘…...

清晰易懂的Miniconda安装教程

小白也能看懂的 Miniconda 安装教程 Miniconda 是一个轻量级的 Python 环境管理工具&#xff0c;适合初学者快速搭建 Python 开发环境。本教程将手把手教你如何在 Windows 系统上安装 Miniconda&#xff0c;并配置基础环境&#xff0c;确保你能够顺利使用 Python 进行开发。即…...

算法016——最小覆盖子串

力扣——最小覆盖子串&#xff08;点击跳转&#xff09; 分析题目 我们先随便从一个位置开始&#xff0c;让 right 右移&#xff0c;直到找到符合题目的位置停下 之后&#xff0c;让 left 右移&#xff0c;此时会出现两种情况 仍然符合要求&#xff0c;right 不需要动不符合…...

DeepSeek-R1大模型微调技术深度解析:架构、方法与应用全解析

1. DeepSeek-R1大模型架构设计与技术特性 1.1 架构设计 DeepSeek-R1作为超大规模语言模型,其核心架构设计包含以下创新: 专家混合架构(MoE) 采用6710亿参数的混合专家架构(MoE),每个推理过程仅激活370亿参数,实现计算效率与资源利用率的突破性提升。 Transformer框架…...

二阶近似 是什么意思

二阶近似 是什么意思 一、二阶近似的概念与举例 二阶近似是数学分析中通过泰勒展开对函数进行近似的方法,保留到二阶项(即包含一阶导数和二阶导数)。在优化问题(如模型训练)中,常用于近似损失函数,帮助更精准地更新模型参数。 举例: 假设损失函数为 L ( θ ) \mathc…...

STM32U575RIT6单片机(四)

作业: 使用I2C获取SHT20传感器温湿度 使用I2C获取AP3216C三合一传感器: 光照, 接近, 红外 三个功能 合并的传感器 #ifndef SHT20_H #define SHT20_H#include "stdint.h" #include "i2c.h" #include "stdio.h" //1、确定从机的设备地址(代码不…...

deepseek内网离线部署手册

前言 在当下 AI 浪潮汹涌的时代&#xff0c;DeepSeek 以其卓越的性能和出色的表现&#xff0c;迅速成为了众多专业人士和科技爱好者热议的焦点工具。在众多AI大模型的比拼中&#xff0c;DeepSeek 展现出了优越的实力。然而&#xff0c;对于许多企业和组织而言&#xff0c;出于…...

第七次作业,网络防御高级

拓扑&#xff1a;1 接口ip配置和区域划分&#xff1a; fw1&#xff1a; [fw1]interface GigabitEthernet 0/0/0 [fw1-GigabitEthernet0/0/0]service-manage all permit ​ [fw1]firewall zone trust [fw1-zone-trust]add interface GigabitEthernet 1/0/0 ​ ​ [fw1]securi…...

“AIGC”狂飙:一场正在撕裂传统产业链的“智能革命”

前言 在过去的几年中&#xff0c;人工智能技术经历了飞速的发展&#xff0c;深刻地改变了全球科技产业的格局。2023年被称为“AI元年”&#xff0c;这一年的标志性事件包括ChatGPT的发布和大语言模型的快速崛起&#xff0c;这些技术突破不仅引发了全球范围内的关注&#xff0c…...

【鸿蒙开发】Hi3861学习笔记- 定时器中断

00. 目录 文章目录 00. 目录01. 概述02. 定时器相关API2.1 hi_timer_create2.2 hi_timer_start2.3 hi_timer_stop2.4 hi_timer_delete 03. 硬件设计04. 软件设计05. 实验现象06. 附录 01. 概述 定时器&#xff0c;顾名思义就是用来计时的&#xff0c;我们常常会设定计时或闹钟…...

GB9706.1-2020部分定义

一、可拆卸的网电源连接器 1、器具耦合器 2、设备电源输入插口 3、可拆卸电源软电线 4、ME 设备 5、固定的网电源插座/多位插座(MSO) 6、网电源连接器 7、网电源插头 二、可拆卸的网电源连接 1、器具输入插座 2、患者连接 3、电线管 4、可拆卸电源软电线 5、外壳 6、固定…...

PCL 多项式拟合点法线(二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这个思路其实很简单,假设我们有一组曲线点,我们可以对其拟合曲线并计算其导数来获取每个点的法向量,当然这一思路也可以扩展至三维。具体过程如下所示: 二、实现代码 PolyFit.h #pragma once/* ** 基于最小二乘…...

docker中安装Ghost报错Error: connect ECONNREFUSED 127.0.0.1:3306

今天尝试在docker中运行ghost报错 "Unknown database error"Error ID:500Error Code: ECONNREFUSED----------------------------------------Error: connect ECONNREFUSED 127.0.0.1:3306at /var/lib/ghost/versions/5.112.0/node_modules/knex-migrator/lib/datab…...

Java创造型模式之原型模式详解

设计模式是面向对象设计中的一种标准方法&#xff0c;用于解决常见的设计问题。原型设计模式&#xff08;Prototype Pattern&#xff09;是23种经典设计模式之一&#xff0c;属于创建型模式&#xff0c;它允许通过复制现有对象来创建新对象&#xff0c;而不是通过构造函数或工厂…...

3.17日Man2Marine

上游任务 vs. 下游任务 任务类型作用你的研究中的例子上游任务(Upstream Task)训练通用的音频表示,提供特征在大规模人类语音数据集上进行自监督学习下游任务(Downstream Task)利用上游任务学到的特征进行具体任务微调模型进行海洋哺乳动物叫声分类在 NLP(自然语言处理)…...

Fisher信息、梯度方差与学习率调度器的计算流程

Fisher信息、梯度方差与学习率调度器的计算流程 目录 Fisher信息、梯度方差与学习率调度器的计算流程**步骤1:定义模型与数据集****步骤2:计算梯度与Fisher信息****步骤3:计算梯度方差****步骤4:定义学习率调度器****步骤5:参数更新流程****示例输出****关键概念说明**步骤…...

209、不大于n的数的组合(python)

题目 已知一个数n和可组合的数字集合s&#xff0c;通过组合数字集合构成一个数x&#xff0c;使其不大于n。 例如&#xff1a; n 22356789 a [2, 3, 4, 8, 9] x 22349999 代码实现 n 22356789 a [2, 3, 4, 8, 9] a.sort() s str(n) tag True res [] for i in range…...

Matlab 汽车电子驻车系统仿真分析

1、内容简介 Matlab 176-汽车电子驻车系统仿真分析 可以交流、咨询、答疑 2、内容说明 略 摘 要&#xff1a; 论述了电子驻车制动控制系统的基本结构 、 组成及功能&#xff0c;并基于 Matlab/Simulink &#xff0c;构建了包括直流电机 、 丝杠螺母及其内部 零件和相关摩擦力…...

蓝桥杯备考----模拟算法 phone number

嗯。这道题可以在两个和三个数字加-&#xff0c;我们只要随便输出一个奏行 那么&#xff01;我们规范一下&#xff0c;我们尽可能的只在两个数字之间加&#xff0c;但是如果一共奇数个的话&#xff0c;我们就让最后三个成一组&#xff0c;也就是说&#xff0c;我们用的是个小贪…...

Unity WebGL IIS报错无法使用

Unity WebGL IIS报错无法使用 原因1&#xff1a;WebGL文件夹无访问权限 右键WebGL文件夹-属性 点击安全-编辑-添加 输入ever点击确定-应用即可...

【算法学习之路】11.并查集

并查集 前言一.简介二.基础并查集三.基础并查集题目12 四.种类并查集&#xff08;扩展域并查集&#xff09;五.种类并查集的题目 前言 我会将一些常用的算法以及对应的题单给写完&#xff0c;形成一套完整的算法体系&#xff0c;以及大量的各个难度的题目&#xff0c;目前算法也…...

第三课:Python递归编程艺术(从基础到优化)

递归&#xff0c;作为编程中一种优雅而强大的技术&#xff0c;以其简洁的代码风格和强大的问题解决能力&#xff0c;在算法设计中占据着举足轻重的地位。然而&#xff0c;递归的奥秘不仅仅在于其表面的简洁&#xff0c;更在于其背后的逻辑深度与优化技巧。本文将深入探讨递归编…...

插入排序程序并行化

一 插入排序 插入排序是稳定的原地排序算法,核心思想是逐步构建有序序列。对于未排序部分的每个元素,在已排序序列中从后向前扫描,找到合适位置插入。 二 并行化思路 1 分块排序 将数组分成多个子块,每个线程使用插入排序处理一块。 2 归并合并 将各有序子块归并成最终数…...

【系统架构设计师】操作系统 - 文件管理 ③ ( 树形目录结构 | 文件属性 | 绝对路径 与 相对路径 )

文章目录 一、树形目录结构1、树形目录结构 概念简介2、树形目录结构 组成3、文件属性4、树形目录结构 示例 二、绝对路径 与 相对路径1、绝对路径2、相对路径3、绝对路径 与 相对路径 对比 一、树形目录结构 1、树形目录结构 概念简介 " 树形目录结构 “ 又称为 ” 多级目…...

【量化科普】Standard Deviation,标准差

【量化科普】Standard Deviation&#xff0c;标准差 &#x1f680;量化软件开通 &#x1f680;量化实战教程 在量化投资领域&#xff0c;标准差&#xff08;Standard Deviation&#xff09;是一个非常重要的统计指标&#xff0c;用于衡量一组数据的离散程度。简单来说&#…...

实验三 Python 数据可视化 Python 聚类-K-means(CQUPT)

一、实验目的 Python 数据可视化&#xff1a; 1、学习使用 jieba、wordcloud 等类库生成词云图。 2、学习使用 Matplotlib 库进行数据可视化。 Python 聚类-K-means&#xff1a; 1、理解聚类非监督学习方法的基本原理。 2、掌握 Python、numpy、pandas、sklearn 实现聚类…...

东方通TongHttpServer:企业级服务代理中间件的卓越之选

随着信息技术的飞速发展&#xff0c;企业对于高性能、高安全性的中间件需求日益增长。东方通作为中国中间件领域的领军企业&#xff0c;凭借其在“安全”、“数据”和“智慧”三大产品体系上的深厚积累&#xff0c;推出了TongHttpServer&#xff08;简称THS&#xff09;&#x…...

EB-Cable许可证的常见问题及解决方案

在使用EB-Cable软件时&#xff0c;许可证问题可能是用户经常遇到的挑战之一。为了帮助用户更好地理解和解决许可证相关的问题&#xff0c;本文将列举一些常见的EB-Cable许可证问题&#xff0c;并提供相应的解决方案。 常见问题一&#xff1a;许可证激活失败 问题描述&#xff…...

ZED X系列双目3D相机的耐用性与创新设计解析

在工业自动化和学术研究领域&#xff0c;高精度的视觉设备正成为提升效率和质量的关键。ZED X系列AI立体相机&#xff0c;凭借其先进的技术和耐用的设计&#xff0c;为这一领域带来了新的可能。 核心技术&#xff1a;深度感知与精准追踪 ZED X系列的核心技术之一是Neural Dept…...

深入解析Java面向对象三大特征之多态、final、抽象类与接口

面向对象编程&#xff08;OOP&#xff09;的三大核心特征为封装、继承、多态&#xff0c;其中多态是最具灵活性和扩展性的特性。本文将从多态的本质出发&#xff0c;结合final关键字、抽象类与接口的设计&#xff0c;深入探讨这些概念的应用场景及其在代码中的实现细节&#xf…...

jmeter 循环控制器遍历列表中的数据

jmeter遍历列表中的数据并使用if控制器做相应的处理 测试场景请求获取列表接口发送请求JSON Extractor 提取对应字段 Loop Controller计数器If Controller 测试场景 请求获取列表接口使用循环控制器遍历接口&#xff0c;根据state字段判断是否发起其他请求 请求获取列表接口 …...

【Linux内核系列】:进程板块与文件板块的综合

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 人生中成功只是一时的&#xff0c;失败却是人生的主旋律&#xff0c;但是如何面对失败却把人分成了不同的样子&#xff0c;有的人会被…...

深入理解嵌入式开发中的三个重要工具:零长度数组、container_of 和 typeof

在嵌入式开发中,内核开发者经常需要处理复杂的数据结构和动态内存分配。零长度数组、container_of 宏和 typeof 是内核开发中三个非常重要的工具,它们在结构体管理、内存操作和类型处理中发挥着关键作用。本文将详细探讨这三个工具的功能、应用场景及其在内核开发中的重要性。…...

第27周JavaSpringboot git初识

Git 课程笔记 一、Git 的介绍 1. Git 的诞生背景 Git 是 Linux 内核的作者 Linus Torvalds 为了更好地管理 Linux 内核开发而创建的版本控制系统。在 Linux 内核开发初期&#xff0c;由于开发者众多&#xff0c;协作成本很高&#xff0c;后来使用了 BitKeeper 工具来辅助协作…...

实战2. 利用Pytorch解决 CIFAR 数据集中的图像分类为 10 类的问题——提高精度

实战2. 利用Pytorch解决 CIFAR 数据集中的图像分类为 10 类的问题——提高精度 前期准备加载数据建立模型模型训练质量指标 让我们回到图像分类问题 CIFAR。 你的主要任务&#xff1a;实现整个模型训练流程&#xff0c;并在测试样本上获得良好的准确度指标值。 任务积分&#…...

CentOS高性能数据处理优化指南

在CentOS系统中&#xff0c;为实现高性能数据处理&#xff0c;需要从多个层面进行优化&#xff0c;包括系统配置、内核参数、硬件资源管理及软件优化等。 一、硬件优化 选择合适硬件是优化性能的基础&#xff0c;大规模数据处理任务建议使用多核CPU、大容量内存、SSD存储以及…...