C++特性——智能指针
为什么需要智能指针
对于定义的局部变量,当作用域结束之后,就会自动回收,这没有什么问题。
当时用new delete的时候,就是动态分配对象的时候,如果new了一个变量,但却没有delete,这会造成内存泄露。
特别是当大型项目,会使用多个指针指向同一块内存区域的时候,什么时候释放这块指针所指向的内存区域就成了一个问题。
智能指针就是解决这个问题的办法,他的思想就是当你定义了一个智能指针,可以像普通指针一样使用*⃣️来获取里面的内容,当用其他的智能指针再次指向这块区域的时候,会有一个计数器。当所有的智能指针都被标记为不再使用的时候,这个计数器清零,这块指针所指向的内存也就被释放。
什么是动态分配的对象? 是指在程序运行时(而非编译时)在堆(heap)内存中分配的对象。
注意
在使用智能指针的时候,一定要避免使用delete,可能会引发未定义的行为,就让系统自己处理。
unique_ptr性能很好,不支持复制,唯一控制权;shared_ptr支持多个指针指向同一块内存并计数,资源消耗大。
任何时候都推荐使用unique_ptr,而shared_ptr当多个函数
shared_ptr
引入#include <memory>
用法:shared _ptr<T> p = make_shared<T>()或者大括号的初始方法shared_ptr<T> p {fp, close_file}
例如shared _ptr<int> p = make_shared<int>(100)的意思就是定义了一个指向存储内容为100的动态内存的共享指针p。此时p.use_count() 引用计数为1。
当定义其他的共享指针p1=p时,表示p1也指向了int类型的100的这块内存,同理如果是对象,不会再构造一次,因为指向的是同一块东西。此时再使用p.use_count()或者p1.use_count()得到的计数结果都是2。
当p.reset()就表示重置p指向的内容,此时引用计数会减1,当p1.reset()p1也重置之后,引用计数为0,这块内存被释放。
额外补充
p.reset()这个用法还可以在括号里p.reset(new int)代表指向一个新的int内存,旧的int内存减1- 在新定义一个共享指针的时候,是可以对它的释放功能自定义的,可以自定义为其他的功能,例如下图将释放功能自定义为文件关闭函数。当引用计数为0的时候,就可以自动关闭文件。

- 别名
shared_ptr<example_class> p1 {p, &(p->bar)}p1是p的别名
unique_ptr
引入#include <memory>
用法:unique_ptr<int> p = make_unique<int>(100)
unique_ptr就不存在复制这样的功能,p独享这一块资源,不能和别的指针共享。
当作用域结束之后,unique_ptr指向的资源就会释放,即使它是用的new delete来创建的。
可以使用p.get()获取裸指针。
同样的,可以使用p.reset()来重置unique_ptr使其指向nullptr。也可以p.reset(new class)来让这个unique_ptr指向一个新的类。
可以使用p.release()来释放p对这块资源的控制权,会返回一个裸指针。unique_ptr中是没有复制这么一说的,也就不存“=”的赋值。但是可以传递:通过unique<exapmle_class> p1 (p.release())或者是利用move,即unique_ptr<example_class> p1(p.move())
unnique_ptr可以自定义分配函数和自定义释放函数,eg:

unique_ptr的函数绑定是在编译时就绑定了,这个函数成为了unique_ptr实例的一部分,而shared_ptr则是运行时绑定。
在函数之间的unique_ptr传递
指针在函数之间的传递难免不会发生复制,例如实参作为输入进入函数之后,函数可能会复制一份进入函数体。
解决办法:
- 函数的形参是一个unique_ptr的引用
- 只传递所指向的资源例如传入*p,接收也是一个int& p。
- 利用p.get()或者是move(),这样会传递一个裸指针到函数里去。
相关文章:
C++特性——智能指针
为什么需要智能指针 对于定义的局部变量,当作用域结束之后,就会自动回收,这没有什么问题。 当时用new delete的时候,就是动态分配对象的时候,如果new了一个变量,但却没有delete,这会造成内存泄…...
ctf web入门知识合集
文章目录 01做题思路02信息泄露及利用robots.txt.git文件泄露dirsearch ctfshow做题记录信息搜集web1web2web3web4web5web6web7web8SVN泄露与 Git泄露的区别web9web10 php的基础概念php的基础语法1. PHP 基本语法结构2. PHP 变量3.输出数据4.数组5.超全局变量6.文件操作 php的命…...
DeepSeek:技术教育领域的AI变革者——从理论到实践的全面解析
一、技术教育为何需要DeepSeek? 在数字化转型的浪潮下,技术教育面临着知识更新快、实践门槛高、个性化需求强三大核心挑战。传统的教学模式难以满足开发者快速掌握前沿技术、构建复杂系统能力的需求。DeepSeek作为国产开源大模型的代表,凭借…...
MySQL-存储过程和自定义函数
存储过程 存储过程,一组预编译的 SQL 语句和流程控制语句,被命名并存储在数据库中。存储过程可以用来封装复杂的数据库操作逻辑,并在需要时进行调用。 使用存储过程 创建存储过程 create procedure 存储过程名() begin存储过程的逻辑代码&…...
图——表示与遍历
图的两种主要表示方法 图有两种常用的表示方法,一种是邻接表法(adjacency-list),另一种是邻接矩阵法(adjacency-matrix)。 邻接表法储存数据更紧凑,适合稀疏的图(sparse graphs&am…...
新手村:数据预处理-异常值检测方法
机器学习中异常值检测方法 一、前置条件 知识领域要求编程基础Python基础(变量、循环、函数)、Jupyter Notebook或PyCharm使用。统计学基础理解均值、中位数、标准差、四分位数、正态分布、Z-score等概念。机器学习基础熟悉监督/无监督学习、分类、聚类…...
电磁兼容性|电子设备(EMC)测试与系统化整改
在现代电子工程领域,5G通信、物联网与人工智能技术深度融合,电磁兼容性(EMC)已成为衡量设备可靠性的关键指标。据国际电磁兼容协会(IEEE EMC Society)2024年度报告显示,全球因EMC问题导致的电子…...
联合体定义与应用
引言 讲到了结构体,那同时类似的结构就还有联合体,本文就将详解介绍联合体。 在C语言中,联合体(union)是一种特殊的数据结构,它与结构体(struct)相似,但有一个显著的不同:联合体的所有成员共用同一块内存空间。这意味着在任何时候,联合体中只能有一个成员保存有效数…...
ChatGPT-4
第一章:ChatGPT-4的技术背景与核心架构 1.1 生成式AI的发展脉络 生成式人工智能(Generative AI)的演进历程可追溯至20世纪50年代的早期自然语言处理研究。从基于规则的ELIZA系统到统计语言模型,再到深度学习的革命性突破&#x…...
C语言_数据结构总结9:树的基础知识介绍
1. 树的基本术语 - 祖先:考虑结点K,从根A到结点K的唯一路径上的所有其它结点,称为结点K的祖先。 - 子孙:结点B是结点K的祖先,结点K是B的子孙。结点B的子孙包括:E,F,K,L。 - 双亲:路径上…...
基于ydoVr算法的车辆智能防盗系统的设计与实现
标题:基于ydoVr算法的车辆智能防盗系统的设计与实现 内容:1.摘要 随着汽车保有量的不断增加,车辆被盗问题日益严重,给车主带来了巨大的经济损失。为解决这一问题,本文旨在设计并实现基于ydoVr算法的车辆智能防盗系统。该系统综合运用传感器技…...
Python学习第十八天
Django模型 定义:模型是 Django 中用于定义数据库结构的 Python 类。每个模型类对应数据库中的一张表,类的属性对应表的字段。 作用:通过模型,Django 可以将 Python 代码与数据库表结构关联起来,开发者无需直接编写 S…...
蓝桥杯备考:图论之Prim算法
嗯。通过我们前面的学习,我们知道了,一个具有n个顶点的连通图,它的生成树包括n-1个边,如果边多一条就会变成图,少一条就不连通了 接下来我们来学一下把图变成生成树的一个算法 Prim算法,我们从任意一个结…...
min_element用法
查找字典中的最小value值 auto max_it std::min_element(my_map.begin(), my_map.end(),[](const auto& a, const auto& b) {return a.second < b.second; // 查找最小值});其中,这是一个查找最小值的自定义函数 [](const auto& a, const auto&am…...
列表动态列处理
1、在initialize()方法里,获取列表控件,添加CreateListColumnsListener监听 public void initialize(){ BillList billlist(BillList)this.getControl("billlistap"); billlist.addCreateListColumnsListener(this::beforeCreateListColumns)…...
科普:WOE编码与One-Hot编码
WOE编码是业务逻辑与统计建模的结合,适合强业务导向的场景; One-Hot编码是数据驱动的特征工程,适合追求模型性能的场景。 编码方式核心价值典型案例WOE编码保留变量预测能力,适配线性模型银行违约预测逻辑回归One-Hot编码释放特征…...
【Go语言圣经2.6】
目标 概念 GOPATH模型 GOPATH:GOPATH 是一个环境变量,指明 Go 代码的工作区路径。工作区通常包含三个目录: src:存放源代码,按照导入路径组织。例如,包 gopl.io/ch2/tempconv 应存放在 $GOPATH/src/gopl.i…...
Python的基本知识
Python是一种广泛使用的高级编程语言,以下是其基本用法的介绍: 变量与数据类型 - 变量定义:直接赋值即可创建变量,如 x 5 , name "John" 。 - 数据类型:包括 int (整数…...
QEMU源码全解析 —— 块设备虚拟化(4)
接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(3) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 类模板是创建类的模式_创建类是的模版-CSDN博客<...
34个适合机械工程及自动化专业【论文选题】
论文选题具有极其重要的意义,它直接关系到论文的质量、价值以及研究的可行性和顺利程度。选题明确了研究的具体领域和核心问题,就像给研究旅程设定了方向和目的地。例如,选择 “人工智能在医疗影像诊断中的应用” 这一选题,就确定…...
langchain框架
LangChain的架构分为多个层次,支持Python和JavaScript生态 基础层(langchain-core):提供LLM抽象接口、表达式语言(LCEL)等核心机制,支持超过70种主流模型(如GPT-4、Llama࿰…...
RHCE(RHCSA复习:npm、dnf、源码安装实验)
七、软件管理 7.1 rpm 安装 7.1.1 挂载 [rootlocalhost ~]# ll /mnt total 0 drwxr-xr-x. 2 root root 6 Oct 27 21:32 hgfs[rootlocalhost ~]# mount /dev/sr0 /mnt #挂载 mount: /mnt: WARNING: source write-protected, mounted read-only. [rootlocalhost ~]# [rootlo…...
Mybatis3 调用存储过程
1. 数据库MySQL,user表 CREATE TABLE user (USER_ID int NOT NULL AUTO_INCREMENT,USER_NAME varchar(100) NOT NULL COMMENT 用户姓名,AGE int NOT NULL COMMENT 年龄,CREATED_TIME datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,CREATED_BY varchar(100) NOT NUL…...
解决 openeuler 系统 docker 下载慢,docker 镜像加速
一、步骤说明 1. 编辑 Docker 配置文件 Docker 的镜像源配置文件路径为 /etc/docker/daemon.json。如果该文件不存在,则需要先创建目录和文件。 # 创建目录(如果不存在) sudo mkdir -p /etc/docker# 编辑配置文件(使用 nano 或…...
HiPixel开源AI驱动的图像超分辨率的原生macOS 应用程序,使用 SwiftUI 构建并利用 Upscayl 强大的 AI 模型
一、软件介绍 文末提供程序和源码下载 HiPixel是一个开源程序基于SwiftUI构建的macOS原生应用程序,用于AI驱动的图像超分辨率,并利用Upscayl的强大AI模型。 二、软件特征 具有 SwiftUI 界面的原生 macOS 应用程序使用 AI 模型进行高质量图像放大通过 G…...
Python 正则表达式模块 re
Python 正则表达式模块 re flyfish 一、正则表达式基础 1. 什么是正则表达式? 正则表达式(Regular Expression, RE)是一种用于匹配、查找和替换文本模式的工具,由普通字符(如字母、数字)和特殊字符&…...
[RN 实践有效]Expo+cross-env配置项目环境变量
首先,从中可以看出,cross-env的主要作用是跨平台设置环境变量,而Expo项目通常通过app.config.js或.env文件来管理这些变量。需要强调安装cross-env的必要性,以及如何在package.json中正确配置脚本命令。 接下来,用户的问题是关于Expo中cross-env的详细配置,因此需要分步骤…...
缓存和客户端数据存储体系(Ark Data Kit)--- 应用数据持久化(首选项持久化、K-V、关系型数据库)持续更新中...
Core File Kit做怎删改查操作不便,用Ark Data Kit。 功能介绍 ArkData (方舟数据管理)为开发者提供数据存储、数据管理和数据同步能力,比如联系人应用数据可以保存到数据库中,提供数据库的安全、可靠以及共享访问等管…...
ES 使用geo point 查询离目标地址最近的数据
需求描述:项目中需要通过经纬度坐标查询目标地所在的行政区。 解决思路大致有种,使用es和mysql分别查询。 1、使用es进行查询 将带有经纬度坐标的省市区数据存入es中,mappings字段使用geo point类型,索引及查询dsl如下。 geo p…...
本地部署OpenManus及原理介绍
概述: 最近Minaus特别火,随后开源社区就有项目尝试复刻Minaus,项目名称为OpenManus,原理是用推理模型为决策者,将我们输入的问题进行分解后调用本地工具执行。 OpenManus安装: 本人在Ubuntu桌面版本上安装…...
