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智能指针简述
一、实现原理 在智能指针对象中有一个裸指针,此指针存储的是动态创建对象的地址,用于生存期控制,能够确保智能指针对象离开所在作用域时,自动正确地销毁动态创建的对象,防止内存泄漏。 使用裸指针存在的问题ÿ…...
fastpdf应用程序错误0xc0000142
原因:一般是部分DLL文件未能被系统注册或者丢失,导致动态库调用错误造成的。 解决方法:将DLL文件重新注册一遍。 手动复制:1.按下“winr”打开运行,在运行框中输入“cmd”,再点击确定; 2.在命…...
Linux操作系统实验报告单(3)文本编辑器vi/vim
一、实验目的 掌握vi/vim编辑器的进入和退出方式了解vi/vim的三种模式熟练vi/vim的操作命令 二、实验内容 1.在家目录下新建一个名为“vitest_name”(“name”为学生姓名拼音)的目录。 ●创建用户目录命令:sudo mkdir /home/vitest_lw3613 …...
linux(centos8)下编译ffmpeg
必要依赖 # centos8有些找不到依赖包,需要手动下载源码编译 sudo dnf install -y epel-release sudo dnf install -y git gcc gcc-c make nasm yasm \libtool autoconf automake cmake \bzip2 bzip2-devel zlib-devel \xz xz-devel x264-devel x265-devel \openssl…...
Centos固定IP配置
虚拟机安装 安装vmware 网盘链接 安装centos7.5 网盘链接 安装教程自行查找 固定IP配置 对安装好的VMware进行网络配置,方便虚拟机连接网络,本次设置建议选择NAT模式,需要宿主机的Windows和虚拟机的Linux能够进行网络连接,…...
AI自动获客系统源码
一、AI自动获客的显著优势 在当今商业环境中,AI自动获客技术正逐渐成为企业获客的新宠。相较于传统的获客方式,它展现出诸多显著优势。首先,AI技术能够通过智能分析和精准匹配,快速找到潜在客户,从而大大提高获客效率…...
3.17[Q]CV Bézier curve
我是计算机视觉学生,?详细解释,越细节越好 我是计算机视觉学生,如何使用de Casteljau 算法来绘制由 4 个控制点表示的 Bzier 曲线?原理是什么?工作流程是什么?详细解释,越细节越好…...
K8S学习之基础三十一:k8s中RBAC 的核心概念
Kubernetes (k8s) 中的 RBAC(Role-Based Access Control,基于角色的访问控制)是一种用于管理用户和服务账户对集群资源访问权限的机制。RBAC 允许管理员通过定义角色(Role)和角色绑定(RoleBindingÿ…...
二叉树算法题实战:从遍历到子树判断
目录 一、引言 二、判断两棵二叉树是否相同 思路 代码实现 注意点 三、二叉树的中序遍历 思路 代码实现 注意点 四、判断一棵树是否为另一棵树的子树 思路 代码实现 注意点 编辑 五、补充 一、引言 作者主页:共享家9527-CSDN博客 作者代码仓库&am…...
第8章 信息安全工程(一)
8.1 信息安全管理 8.1.1 保障要求 网络与信息安全保障体系中的安全管理建设,通常需要满足以下 5 项原则: (1)网络与信息安全管理要做到总体策划,确保安全的总体目标和所遵循的原则。 (2)建立相关组织机构,要明确责任部门&…...
学习threejs,使用MeshFaceMaterial面材质容器
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshFaceMaterial 二…...
Git 实战指南:本地客户端连接 Gitee 全流程
本文将以 Gitee(码云)、系统Windows 11 为例,详细介绍从本地仓库初始化到远程协作的全流程操作 目录 1. 前期准备1.1 注册与配置 Gitee1.2 下载、安装、配置客户端1.3 配置公钥到 Gitee2. 本地仓库操作(PowerShell/Git Bash)2.1 初始化本地仓库2.2 关联 Gitee 远程仓库3. …...
Spring Cloud 中的服务注册与发现: Eureka详解
1. 背景 1.1 问题描述 我们如果通过 RestTamplate 进行远程调用时,URL 是写死的,例如: String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 当机器更换或者新增机器时,这个 URL 就需要相应地变…...
通过 SVG 使用 AI 生成理想图片:技术实现与实践指南
文章目录 1. SVG 与 AI 的结合:技术价值2. 技术原理:AI 如何生成 SVG?3. 实现步骤:从需求到图形3.1 定义需求3.2 使用 AI 生成 SVG3.3 验证与调整 4. 代码解析:实现科技感的关键4.1 渐变背景4.2 网格线条4.3 发光六边形…...
【AI学习从零至壹】Pytorch神经⽹络
Pytorch神经⽹络 神经网络简介神经元激活函数 神经网络神经⽹络的⼯作过程前向传播(forward) 反向传播(backward)训练神经⽹络 Pytorch搭建并训练神经⽹络神经⽹络构建和训练过程数据预处理构建模型优化器&提取训练数据训练样本 神经网络简介 神经元 在深度学习中&#x…...
设计模式-对象创建
对象创建 前言1. Factory Method1.1 模式介绍1.2 模式代码1.2.1 问题代码1.2.2 重构代码 1.3 模式类图1.4 要点总结 2. Abstract Factory2.1 模式介绍2.2 模式代码2.2.1 问题代码2.2.2 重构代码 2.3 模式类图2.4 要点总结 3. Prototype3.1 模式介绍3.2 模式代码3.3 模式类图3.4…...
谈谈你对前端工程化的理解,它包含哪些方面
大白话谈谈你对前端工程化的理解,它包含哪些方面 前端工程化其实就是把前端开发变得更规范、更高效、更易于维护的一套方法和流程。就好比你盖房子,不能随便瞎盖,得有设计图纸、施工标准、分工合作,前端工程化也是类似的道理。 项…...
JSON数据格式介绍
2.5 JSON 2.5.1.JSON格式的用途 在开发中凡是涉及到『跨平台数据传输』,JSON格式一定是首选 2.5.2.JSON格式的说明 1.JSON数据两端要么是{},要么是[] {}定义JSON对象[]定义JSON数组 2.JSON对象的格式是:json {key:value,key:value,...,ke…...
java的WeakHashMap可以用来做缓存使用?强软弱虚四种引用对比
在 Java 中,引用(Reference)机制用于管理对象的生命周期和垃圾回收。Java 提供了四种类型的引用:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Refer…...
【AVRCP】Notification PDUs 深入解析与应用
目录 一、Notification PDUs 概述 二、GetPlayStatus:同步查询播放状态 2.1 命令功能与应用场景 2.2 请求格式(CT → TG) 2.3 响应格式(TG → CT) 2.4 注意事项 2.5 协议实现示例(伪代码) 三、RegisterNotification:异步事件订阅 3.1 命令概述 3.2 命令格式 …...
从过拟合到强化学习:机器学习核心知识全解析
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
【MySQL基础-9】深入理解MySQL中的聚合函数
在数据库操作中,聚合函数是一类非常重要的函数,它们用于对一组值执行计算并返回单个值。MySQL提供了多种聚合函数,如COUNT、SUM、AVG、MIN和MAX等。这些函数在数据分析和报表生成中扮演着关键角色。本文将深入探讨这些聚合函数的使用方法、注…...
Lora 中 怎么 实现 矩阵压缩
Lora 中 怎么 实现 矩阵压缩 1. 导入必要的库 import torch import re from datasets import Dataset from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer, \get_cosine_schedule_with_warmup, EarlyStoppingCallback from peft...
MATLAB 控制系统设计与仿真 - 27
状态空间的标准型 传递函数和状态空间可以相互转换,接下来会举例如何有传递函数转成状态空间标准型。 对角标准型 当 G(s)可以写成: 即: 根据上图可知: 约当标准型 当 G(s)可以写成: 即: 根据上图…...
linux 命令 cp
cp 是 Linux 中用于复制文件和目录的命令,基本功能是将源文件或目录复制到目标位置 基本语法 cp [选项] 源文件 目标文件 cp [选项] 源文件1 源文件2 ... 目标目录 常用选项 选项说明-i交互模式(覆盖前询问确认)-r 或 -R递归复制目录&#…...
从FFmpeg命令行到Rust:多场景实战指南
FFmpeg作为功能强大的多媒体处理工具,被广泛应用于视频编辑、格式转换等领域。然而,直接使用FFmpeg的命令行界面(CLI)可能会遇到以下挑战: 命令复杂度高:FFmpeg的命令行参数众多且复杂,初学者可…...
蓝桥杯高频考点——进制转换
进制转换 二进制转十进制代码演示 十六进制转十进制代码演示 十进制转K进制代码演示 任意进制之间的转换代码演示 二进制转十进制 代码演示 // 定义函数 calc,用于将字符转换为对应的数值 int calc(char c) {// 若字符 c 大于等于 9(注:此处…...
【算法百题】专题七_分治快排_专题八_分治归并
文章目录 前言分治快排题:043. [颜⾊分类(medium)](https://leetcode.cn/problems/sort-colors/description/)分析 044. [快速排序(medium)](https://leetcode.cn/problems/sort-an-array/description/)分析 045. [快速…...
DOM4J解析XML, 修改xml的值
1. 引入pom依赖 <dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version> </dependency> 2. 解析xml, 修改xml节点的值 import org.apache.commons.io.IOUtils; import org.dom4…...
3.16[A]FPGA
FPGA的工作原理是通过配置存储器中的数据来控制可编程逻辑单元和互连资源,从而实现用户定义的逻辑功能。用户可以通过硬件描述语言(HDL)编写代码,然后通过综合、映射、布局布线等步骤生成配置数据,最后将这些数据加载到…...
