c++ 智能指针--std::shared_ptr

ops/2024/9/20 1:20:15/ 标签: c++, 算法, 开发语言

在C++中,std::shared_ptr是智能指针的一种,它用于自动管理具有动态生命周期的对象。当std::shared_ptr的实例被销毁或重置时,它所指向的对象(如果仍然存在)将被自动删除(调用delete),前提是这是最后一个指向该对象的std::shared_ptr实例。std::shared_ptr实现了所谓的“共享所有权”模式,允许多个std::shared_ptr实例共同拥有同一个对象。

主要特性

  1. 自动内存管理:当没有任何std::shared_ptr指向一个对象时,该对象会被自动删除,从而避免了内存泄漏。
  2. 共享所有权:多个std::shared_ptr可以指向同一个对象,每个std::shared_ptr的实例都会维护一个内部计数器(通常称为“控制块”),该计数器表示有多少个std::shared_ptr实例正在指向该对象。
  3. 安全拷贝和赋值:当你拷贝或赋值一个std::shared_ptr时,内部计数器会增加,从而确保对象在拷贝或赋值后仍然被正确管理。
  4. 弱引用:通过std::weak_ptr,可以实现对std::shared_ptr所管理对象的非拥有性观察,即不会增加内部计数器的值。这有助于解决循环引用问题。

基本用法

#include <memory>
#include <iostream>class Example {
public:Example() { std::cout << "Example created\n"; }~Example() { std::cout << "Example destroyed\n"; }void sayHello() { std::cout << "Hello from Example\n"; }
};int main() {// 创建一个指向Example的shared_ptrstd::shared_ptr<Example> ptr1 = std::make_shared<Example>();// 拷贝ptr1到ptr2,两个shared_ptr都拥有对象std::shared_ptr<Example> ptr2 = ptr1;// 访问对象ptr1->sayHello();// 当ptr1和ptr2都离开作用域时,Example对象会被自动删除return 0;
}

注意事项

  • 循环引用:如果两个std::shared_ptr相互指向对方,它们将永远不会被销毁,因为每个std::shared_ptr都认为对方还在使用其管理的对象。这可以通过引入std::weak_ptr来解决。
  • 性能:虽然std::shared_ptr提供了方便的内存管理,但相比于原始指针,它在性能上可能会稍差一些,因为它需要维护额外的控制块和进行原子操作。
  • 线程安全std::shared_ptr的拷贝和赋值是线程安全的,但如果你同时从多个线程访问它所管理的对象,则需要确保该对象的访问本身是线程安全的。

http://www.ppmy.cn/ops/97070.html

相关文章

C语言---栈

在C语言中&#xff0c;栈是一种数据结构&#xff0c;主要用于管理函数调用和局部变量。以下是栈的基本概念&#xff1a; 1. **栈的结构**&#xff1a;栈是一种后进先出&#xff08;LIFO&#xff09;的数据结构&#xff0c;最后压入栈的元素最先被弹出。 2. **函数调用**&…

字符设备应用之私有ioctl的使用

ioctl和netlink是用于用户态程序和内核态模块交互的两种方法&#xff0c;这里主要讲解ioctl的使用方法&#xff1b; -----再牛逼的梦想&#xff0c;也抵不住傻逼般的坚持&#xff01; ----20240722 08:26 留一个思考问题&#xff0c;ioctl和netlink的优缺点分别是什么&#xff…

C# 不一样的洗牌算法---Simd指令

洗牌算法&#xff0c;以随机打乱数组中元素的位置 测试数据创建 int[] _data; Random rng new Random(); protected override void CreateData() {_data new int[_size];for (int i 0; i < _data.Length; i){_data[i] i;} } 普通打乱数组元素位置 protected overrid…

oracle中创建视图,将一个表中多条数据整合成一条

要求&#xff1a;根据coil_id和passnum检索出多组数据&#xff0c;根据coil_id和passnum求M2-M16的平均值保留三位小数&#xff0c;并写入到新的视图中 创建视图 FEEDBACK_L1 CREATE VIEW FEEDBACK_L1 AS SELECT COIL_ID, PASSNUM, ROUND(AVG(M2),3) AS avg_M2, ROUND(AVG(M3),…

ESP32智能设备:蓝牙音箱、AI语音助手、环境监测与调节以及智能控制,基于BLE与MQTT技术(代码详解)

本文将介绍如何实现一个功能丰富的ESP32项目&#xff0c;集成蓝牙音箱、AI语音助手、智能设备控制器、环境监测与调节等功能。通过本项目&#xff0c;您将学习到硬件设计、嵌入式编程、蓝牙技术、音频处理、人工智能与语音识别、物联网平台、数据分析及用户界面构建等技术。 一…

建设项目跟踪与展示系统

这是在翻旧文件时翻到的16年写的一个项目 建设项目跟踪与展示系统 建设方案 一、系统建设目的及意义 建设工程项目进度控制的最终目的是确保建设项目按预定的时间完成。能否在预定的时间内交付使用&#xff0c;直接影响到投资效益。为解决施工组织过程中存在问题&#xff0c;…

企业财务自动化:RPA机器人的优势与挑战

随着数字化浪潮的推进&#xff0c;企业财务自动化已成为企业提升效率和降低成本的关键策略。在这一背景下&#xff0c;RPA以其独特的优势&#xff0c;正逐渐成为企业财务自动化的重要工具&#xff0c;然而&#xff0c;RPA在实际应用中也面临着一些挑战。本文金智维将围绕RPA机器…

快速排序的改进(超详细!!!)

改进前的快速排序 代码实现&#xff1a; //快速排序 void quick(int arr[],int start,int end){int i start;int j end;int mid arr[start];int tmp;while(i < j){//从头往后找,比基准小就继续while(arr[i] < mid){i;}//循环结束,i的位置大于等于基准元素//从后往前…

【企业高性能web服务器】

目录 一、Nginx 介绍1、 Nginx 功能介绍2、基础特性3、Nginx 模块介绍 二、Nginx 编译安装1、编写systemd服务 三、平滑升级和回滚1、平滑升级的流程2、升级2、回滚 四、 Nginx 核心配置详解1、实现 nginx 的高并发配置2、Nginx 账户认证功能3、nginx作为下载服务器配置 五、re…

vue3--定时任务cron表达式组件比较

## 背景&#xff1a; 之前使用vue2开发项目时&#xff0c;使用了cron组件&#xff0c;比较了两种组件的使用效果。现在需要把原有的vue2项目升级为vue3&#xff0c;需要对应的cron组件。 方案一&#xff0c;vue3-cron-plus 具体实现&#xff1a; 安装插件 npm install vue3-…

SEO之网站结构优化(十二-绝对路径和相对路径)

初创企业搭建网站的朋友看1号文章&#xff1b;想学习云计算&#xff0c;怎么入门看2号文章谢谢支持&#xff1a; 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客&#xff1a;阿幸SEO~探索搜索排名之道 绝对路径指的是包含城名的完…

奇异递归Template有啥奇的?

如果一个模版看起来很头痛&#xff0c;那么大概率这种模版是用来炫技&#xff0c;没啥用的&#xff0c;但是CRTP这个模版&#xff0c;虽然看起来头大&#xff0c;但是却经常被端上桌~ 奇异递归模板模式&#xff08;Curiously Recurring Template Pattern, CRTP&#xff09;是一…

数字人的形象克隆与语音克隆是伪需求

形象克隆与语音克隆技术&#xff0c;在当前的环境上已经可以成熟的实现&#xff0c;但真的解决了痛点问题吗&#xff1f; 普通人或者一般的公司克隆自己内部人的形象有必要吗&#xff1f;对外界而言&#xff0c;克隆的形象与虚拟的形象并无二致&#xff0c;本身并没有什么知名…

【区块链+商贸零售】消费券 2.0 应用方案 | FISCO BCOS应用案例

方案基于FISCO BCOS区块链技术与中间件平台WeBASE&#xff0c;实现新一代消费券安全精准高效发放&#xff0c;实现消费激励&#xff0c; 促进消费循环。同时&#xff0c;方案将用户消费数据上链&#xff0c;实现账本记录与管理&#xff0c;同时加密机制保证了数据安全性。

【Axure视频教程】中继器表格——设置文字颜色

今天教大家在Axure制作将控制中继器内部控制文字颜色的原型模板&#xff0c;效果包括&#xff1a; 1、用中继器表格的数据来控制文字的颜色&#xff0c;例如60分以下红色文字&#xff0c;90分以上绿色文字双击分值的格子2 2、可以填写或修改分值&#xff0c;修改后根据新值自…

当SOA遇到DDD

本文讨论软件设计中的决策&#xff0c;特别是关于将较大的系统拆分为多个可独立部署的服务端点。不会特别讨论【服务端点设计】&#xff0c;但我想探讨一下为创建多个服务应用程序进行构思的阶段。 面对复杂问题&#xff0c;通常试图理解复杂性的各部分。将问题拆解为更易于理…

C#使用Modbus TCP通讯PLC,实现读写寄存器

一、创建一个Moudbus类&#xff0c;引入NModbus和Modbus这两个包 #region ModbusTCPpublic class NmodbusTcpHelper{// 静态成员变量&#xff0c;用于存储TcpClient实例private static TcpClient tcpClient null;// 静态成员变量&#xff0c;用于存储ModbusIpMaster实例privat…

一个手机到手机之间通话经过了哪些设备

来源&#xff1a;https://www.bilibili.com/video/BV1ic411F7mM/?spm_id_from333.880.my_history.page.click&vd_source6c5d3cd50fc7fa8732bdfb760a055839 一个手机通话需要经过下面三个网络 类别接入网&#xff08;Access Network&#xff09;承载网&#xff08;Transp…

C语言面试题(持续更新)

1.static/const C语言的关键字 static 修饰 局部变量时 延长了局部变量的生命周期 直到程序结束 作用域取决于定义它的函数 static 修饰 全局变量时 只允许全局变量在定义它的源文件中使用 其他文件不能对其进行调用 static 修饰 函数是 也只允许函数在定义它的源文件中使用…

软件开发者的首选:最佳Bug测试工具Top 10

本篇文章介绍了以下软件bug测试管理工具&#xff1a;PingCode、Worktile、Test360、禅道、码云Gitee、优云测试、Jira、GitHub、Axosoft、Bugzilla。 在开发过程中&#xff0c;Bug的管理往往是最让人头疼的问题之一。小问题积累起来不仅会拖延项目进度&#xff0c;还可能影响到…