【问题】C++:有哪些类型的智能指针,区别?
智能指针是一种在 C++ 中管理动态分配内存的工具,可以帮助避免内存泄漏和提高程序的安全性。在 C++11 标准引入之后,C++ 提供了三种主要类型的智能指针,它们分别是 std::unique_ptr、std::shared_ptr 和 std::weak_ptr。这些智能指针有不同的所有权管理方式和适用场景。
1. std::unique_ptr
- 独占所有权:
std::unique_ptr管理其所指向的对象,并且独占对该对象的访问权限。 - 特点:不能被复制,但可以通过移动语义转移所有权。当
std::unique_ptr被销毁时,它所管理的对象也会被自动销毁。 - 适用场景:适用于需要独占所有权且生命周期明确的场景,如避免内存泄漏的最佳选择。
std::unique_ptr<int> ptr = std::make_unique<int>(10);
2. std::shared_ptr
- 共享所有权:
std::shared_ptr允许多个指针共享同一个对象。它维护一个引用计数,当最后一个std::shared_ptr被销毁时,其所管理的对象被释放。 - 特点:可以被复制和赋值,引用计数递增和递减是自动管理的。
- 适用场景:适用于多个指针需要访问同一对象的场景,如数据结构的节点。
std::shared_ptr<int> ptr1 = std::make_shared<int>(20);
std::shared_ptr<int> ptr2 = ptr1; // 引用计数增加
3. std::weak_ptr
- 弱引用:
std::weak_ptr是为了解决std::shared_ptr的循环引用问题而引入的。它不增加引用计数,只是提供了对所指向对象的非拥有访问权限。 - 特点:不能直接访问对象,需要通过
lock()方法转换为std::shared_ptr才能访问对象。 - 适用场景:主要用于避免
std::shared_ptr循环引用导致的内存泄漏,例如图结构或者双向引用场景。
std::shared_ptr<int> shared = std::make_shared<int>(30);
std::weak_ptr<int> weak = shared;
if (auto sharedPtr = weak.lock()) {// 使用 sharedPtr 访问对象
} else {// 对象已经被销毁
}
区别总结
- 所有权管理:
std::unique_ptr独占所有权,std::shared_ptr共享所有权,std::weak_ptr不影响所有权。 - 复制和赋值:
std::unique_ptr不能复制,只能移动;std::shared_ptr可以复制和赋值;std::weak_ptr不能直接访问对象,需要通过lock()方法转换为std::shared_ptr才能访问。 - 线程安全:
std::shared_ptr在多线程环境下使用时需要考虑引用计数的线程安全性,而std::weak_ptr可以避免循环引用导致的内存泄漏。
选择合适的智能指针取决于所需的所有权模型和对象生命周期管理策略。
相关文章:
【问题】C++:有哪些类型的智能指针,区别?
智能指针是一种在 C 中管理动态分配内存的工具,可以帮助避免内存泄漏和提高程序的安全性。在 C11 标准引入之后,C 提供了三种主要类型的智能指针,它们分别是 std::unique_ptr、std::shared_ptr 和 std::weak_ptr。这些智能指针有不同的所有权…...
Go-反射
概念 在Go语言中,反射(reflection)是指在运行时检查程序的结构、变量和接口的机制。可以通过反射获取和修改变量的值、获取变量的类型信息、调用方法等操作。 反射主要由reflect包提供,它定义了两个重要的类型:Type和…...
【深度学习】DeepSpeed,ZeRO 数据并行的三个阶段是什么?
文章目录 ZeRO实验实验设置DeepSpeed ZeRO Stage-2 实验性能比较进一步优化DeepSpeed ZeRO Stage-3 和 CPU 卸载结论ZeRO ZeRO(Zero Redundancy Optimizer)是一种用于分布式训练的大规模深度学习模型的优化技术。它通过分片模型状态(参数、梯度和优化器状态)来消除数据并行…...
代码随想录算法训练营第三十六天 | 1049. 最后一块石头的重量 II、494. 目标和、474.一和零
一、1049. 最后一块石头的重量 II 题目链接:1049. 最后一块石头的重量 II - 力扣(LeetCode) 文章讲解:代码随想录 (programmercarl.com)——1049. 最后一块石头的重量 II 视频讲解:动态规划之背包问题,这个…...
Pandas行列变换指南:数据重塑的艺术
数据分析中,数据的形态至关重要。pandas库提供了一系列工具,让我们能够轻松地重塑数据。以下是一些常见的pandas行列变换方法,每种方法都配有完整的代码示例。 环境准备 首先,确保你的环境中安装了pandas和numpy库: …...
1.MySQL面试题之innodb如何解决幻读
1. 写在前面 在数据库系统中,幻读(Phantom Read)是指在一个事务中,两次读取同一范围的数据集时,由于其他事务的插入操作,导致第二次读取结果集发生变化的问题。InnoDB 作为 MySQL 的一个存储引擎ÿ…...
Nginx中$http_host、$host、$proxy_host的区别
知识巩固! 网上看到这篇文章,这里转载记录一下。 简介 变量是否显示端口值是否存在 host 浏览器请求的ip,不显示端口 否 "Host:value"显示 值为a:b的时候,只显示a http_host 浏览器请求的ip和端口号 是"Host:v…...
C# Unity 面向对象补全计划 七大原则 之 里氏替换(LSP) 难度:☆☆☆ 总结:子类可以当父类用,牛马是马,骡马也是马
本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识,看不懂没关系 请看专栏:http://t.csdnimg.cn/mIitr,尤其是关于继承的两篇文章ÿ…...
PXE批量安装操作系统
PXE批量安装操作系统 系统环境rhedhat7.9关闭vmware内的dhcp服务 kickstart自动安装脚本的制作 在rhel7系统中提供图形的kickstart制作方式 在rhel8中已经把图形的工具取消,并添加到rhn网络中 在rhel8中如果无法通过rhn网络制作kickstart,可以使用模板…...
float32转float16、snorm/sunorm8/16 学习及实现
1、基础 彻底搞懂float16与float32的计算方式-CSDN博客 例1:float32 0x3fd00000 32b0 011_1111 _1 101_0000_0000_0000_0000_0000 sign0 exp8b0111_1111 h7f d127 >0ffset 127-127 0 mantissa b101_0000_0000_0000_0000_0000(补1,1.1010…...
小型养猫空气净化器怎么选?小型养猫空气净化器产品评测
家养四只猫猫,对于各个角落的猫毛,感觉家里已经被猫毛占领了。感受一下40度高温的养猫人,给掉毛怪疏毛浮毛飘飘,逃不过的饮水机,各个角落,多猫拉臭传来的异味。 一、养猫带来的麻烦 掉毛:每到换…...
数学建模--二分法
目录 二分法的基本原理 应用实例 求解方程根 查找有序数组中的元素 注意事项 Python代码示例 编辑 延伸 二分法在数学建模中的具体应用案例有哪些? 如何选择二分法的初始区间以确保收敛速度和精度? 在使用二分法求解方程时,如何…...
如何使用 Puppeteer 绕过 Akamai
摘要: 本文深入探讨了在面对Akamai强大防护下的网页抓取挑战时,如何运用Puppeteer这一强大的Node.js库,通过模拟真实用户行为、动态请求处理等策略,高效且隐蔽地收集数据。我们将一步步揭开Puppeteer绕过Akamai的神秘面纱&#x…...
【硬件知识】车规级开发等级——AEQ-100和ISO26262标准
文章目录 一、定义二、区别1.应用场景2.使用方法 总结 一、定义 AEQ-100(Automotive Electronics Council Q100)是一个由汽车电子委员会(AEC)制定的标准,主要用于保证汽车电子元件的可靠性。它是一个关于汽车级半导体…...
Qt | QStackedBarSeries(堆叠条形图)+QPercentBarSeries(堆叠百分比条形图)
点击上方"蓝字"关注我们 01、QBarSet 1. 首先,需要创建一个名为QBarSet的类。 2. 在QBarSet类中,定义所需的属性和方法。 3. 属性可能包括条形的名称、颜色、值等。 4. 方法可能包括添加条形、删除条形、计算总和等。 5. 确保QBarSet类能够与QBar类协同工作,…...
C++——多态经典案例(一)组装电脑
案例:小明打算买两台组装电脑,假设电脑零部件包括CPU、GPU和内存组成。 一台电脑使用intel的CPU、GPU和内存条 一台电脑使用Huawei的CPU、GPU和Intel的内存条 分析:使用多态进行实现 将CPU、GPU和内存条定义为抽象类,内部分别定义…...
从传统监控到智能化升级:EasyCVR视频汇聚平台的一站式解决方案
随着科技的飞速发展和社会的不断进步,视频监控已经成为现代社会治安防控、企业管理等场景安全管理中不可或缺的一部分。而在视频监控领域,EasyCVR视频汇聚平台凭借其强大的多协议接入能力,在复杂多变的网络环境中展现出了卓越的性能和广泛的应…...
Windows下,已知程序PID,取得其窗口句柄HWND
我需要实现这么一个功能:在知道某个程序的PID的情况下,最大化并且置顶显示这个程序的窗口。经过一番资料的查找,并且借助了一些科技的力量,找到了解决办法: struct FindWindowData {DWORD processId;HWND hWnd; };BOO…...
Java获取exe文件详细信息:产品名称,产品版本等
使用Maven项目,在pom.xml文件中注入: <dependency><groupId>com.kichik.pecoff4j</groupId><artifactId>pecoff4j</artifactId><version>0.4.1</version></dependency> 程序代码: import …...
ORB-SLAM2运行环境搭建
操作系统:Ubuntu20.04 1.安装Eigen3 推荐大家安装版本 3.2.10 链接:https://eigen.tuxfamily.org/index.php?titleMain_Page mkdir build cd build cmake .. sudo make install2.安装Pangolin 推荐安装0.5版本 链接:https://github.com…...
从 Python 和 Node.js 的流行看 Java 的真实位置
很多 Java 程序员都会有一个感觉:Python 很火,Node.js 也很火,Java 是不是没落了? 先说结论:Java 没有没落,只是位置变了。一、为什么 Python 和 Node.js 看起来更火 1. Python 火,是因为 AI 太…...
高效双电源自动切换电路的设计与实现
1. 双电源自动切换电路的应用场景 双电源自动切换电路在现代电子设备中扮演着关键角色,它能确保设备在不同供电来源之间无缝切换,避免断电导致的系统崩溃。这种电路设计特别适合以下场景: 便携式设备:比如蓝牙音箱、移动电源等&am…...
万象视界灵坛代码实例:使用Gradio快速搭建像素风Web UI,零前端开发经验可用
万象视界灵坛代码实例:使用Gradio快速搭建像素风Web UI,零前端开发经验可用 1. 项目概述 万象视界灵坛是一款基于OpenAI CLIP模型的多模态智能感知平台,它将复杂的语义对齐功能包装在充满游戏感的像素风界面中。这个项目最大的特点是完全不…...
从ONNX到TPU:跨框架模型部署的编译器避坑指南(2023最新版)
从ONNX到TPU:跨框架模型部署的编译器避坑指南(2023最新版) 当ResNet模型在PyTorch中达到99%的测试准确率时,真正的挑战才刚刚开始——如何让这个模型在边缘设备的TPU芯片上高效运行?这个问题困扰着85%的AI工程师。本文…...
电赛E题三子棋:我是如何用Open MV色块识别替代矩形识别,搞定棋盘定位的?
电赛E题三子棋:OpenMV色块识别技术实战解析 从矩形识别到色块识别的技术转型 在电子设计竞赛的视觉识别任务中,棋盘定位一直是个经典难题。最初我们团队采用了官方推荐的矩形识别方案,但实际调试中遇到了诸多挑战: 识别率不稳定&a…...
United VARs CoE创享会重回上海,全球伙伴共议AI时代云ERP演进
时隔七年,United VARs Cloud ERP CoE 创享会再次回到中国!3月10日至12日,由Acloudear司享承办的United VARs Cloud ERP CoE 创享会在上海举行。来自全球多家United VARs成员机构及SAP的专家与管理者齐聚上海,围绕 Cloud ERP 战略、…...
LFM2.5-1.2B-Thinking多场景落地:Ollama支持下的技术博客写作、论文摘要生成案例
LFM2.5-1.2B-Thinking多场景落地:Ollama支持下的技术博客写作、论文摘要生成案例 你是不是也遇到过这样的烦恼:想写一篇技术博客,对着空白的文档发呆半天,不知道从何下笔;或者面对一篇几十页的学术论文,需…...
春联生成模型快速上手:输入‘幸福‘、‘平安‘等关键词,自动生成对仗工联
春联生成模型快速上手:输入幸福、平安等关键词,自动生成对仗工联 1. 春联生成器简介 春节贴春联是中国人延续千年的传统习俗,但创作一副对仗工整、寓意吉祥的春联并不容易。现在,借助AI技术,任何人都能轻松生成专业水…...
Java毕业设计实战:基于SpringBoot的社区健康档案管理系统开发指南
1. 为什么选择SpringBoot开发健康档案管理系统 作为一个带过上百个Java毕业设计的导师,我强烈推荐用SpringBoot来开发社区健康档案管理系统。去年我带的学生小张就用这个框架完成了他的毕设,不仅顺利通过答辩,还被当地社区卫生服务中心看中直…...
脑机接口工具箱实战(一):基于BCILAB的P300信号处理与分类全流程解析
1. 认识P300与BCILAB工具箱 P300是脑电信号中一种特殊的诱发电位,通常在受试者识别到罕见或重要刺激后约300毫秒出现。这种信号在脑机接口研究中具有重要价值,比如拼写系统、注意力监测等应用场景。对于刚接触脑机接口的研究者来说,最大的挑…...
