条款19 对共享资源使用std::shared_ptr

目录

一、std::shared_ptr

二、std::shared_ptr性能问题

三、control block的生成时机

四、std::shared_ptr可能存在的问题

五、使用this指针作为std::shared_ptr构造函数实参

六、std::shared_ptr不支持数组


一、std::shared_ptr<T>

shared_ptr的内存模型如下图:

  • 比正常纸质大一倍(16byte)
  • 由图可以看出,shared_ptr包含了一个指向对象的指针和一个指向控制块的指针
  • 每一个由shared_ptr管理的对象都有一个控制块,它除了包含强引用计数、弱引用计数之外,还包含了自定义删除器的副本和分配器的副本以及其他附加数据(与unique不同)。并且shared_ptr的大小不会受自定义删除器大小的变化而变化。
auto loggingDel=[](Widget* pw){ makeLogEntry(pw); delete pw;}std::unique_ptr<Widget, decltype(loggingDel)> upw(new Widget, loggingDel);
std::shared_ptr<Widget)> spw(new Widget, loggingDel);

二、std::shared_ptr性能问题

  1. 大小需要是原始指针的两倍
  2. 引用技术内存必须动态分配
  3. 引用技术的增减必须是原子操作

三、control block的生成时机

  1. 使用 std::make_shared
  2. 向 shared_ptr 的构造函数中传入一个裸指针
  3. 通过 unique_ptr 构造 shared_ptr

四、std::shared_ptr可能存在的问题

如何解决?

查看 三、control block的生成时机, 调用拷贝构造就不会创建blcok

五、使用this指针作为std::shared_ptr构造函数实参

上面的代码会创建两次 control_blcok ,那有什么解决方法?CRTP

但是下面这两种写法也会存在问题

终极版本

#include <memory>
#include <vector>
#include <iostream>class Widget;
std::vector<std::shared_ptr<Widget>> processedWidgets;class Widget : public std::enable_shared_from_this<Widget>
{
public:template <typename... Ts>static std::shared_ptr<Widget> create(Ts &&...params){return std::shared_ptr<Widget>(new Widget(std::forward<Ts>(params)...));}void process(){processedWidgets.emplace_back(shared_from_this());}private:Widget(int data) : _data(data){}; // privateint _data;
};int main()
{{auto w = Widget::create(1);// Widget w;w->process();}std::cout << "over" << std::endl;return 0;
}

六、std::shared_ptr不支持数组

std::shared_ptr<T []>没有这种写法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/65394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

巩义网站建设:如何打造一个成功的企业网站

巩义网站建设是企业发展中至关重要的一环。一个成功的企业网站不仅仅是一个展示产品和服务的平台&#xff0c;更是企业形象和品牌的代表。在建设企业网站时&#xff0c;首先要考虑用户体验。网站的设计应简洁明了&#xff0c;易于导航&#xff0c;让用户能够快速找到他们需要的…

【Maven】聚合与继承

目录 1. 聚合工程 2. 聚合工程开发 3. 继承关系 4. 继承关系开发 5. 聚合与继承的区别 1. 聚合工程 什么叫聚合&#xff1f; 聚合&#xff1a;将多个模块组织成一个整体&#xff0c;同时进行项目构建的过程称为聚合 聚合工程&#xff1a;通常是一个不具有业务功能的”空…

bash shell的条件语句

&#xff5e; script% touch if.sh &#xff5e; script% chmod 755 if.sh1.if-then-fi #!/usr/bin/env bashFOOD$1 if [ $FOOD"apple" ] thenecho The food is $FOOD fi exit 0~ script % ./if.sh apple The food is apple如果要将多条语句写在一行&#xff0c;可以…

猛将:如何在众多信仰中找到属于自己的力量?

Hi&#xff0c;我是蒙&#xff0c;欢迎来到猛将潜意识&#xff0c;带你运用潜意识快速成长&#xff0c;重塑人生&#xff01; 潜意识有猛将&#xff0c;人生再无阻挡&#xff01; 每日一省写作274/1000天 信仰是什么&#xff1f;我们生活在一个信仰流派繁多的时代&#xff0c;…

jwt在express中token的加密解密实现方法

在我们前面学习了 JWT认证机制在Node.js中的详细阐述 之后&#xff0c;今天来详细学习一下token是如何生成的&#xff0c;secret密钥的加密解密过程是怎么样的。 安装依赖 express&#xff1a;用于创建服务器jsonwebtoken&#xff1a;用于生成和验证JWTbody-parser&#xff1…

RDFS—RDF模型属性扩展解析

目录 前言1. 什么是RDFS&#xff1f;1.1 RDFS的核心概念1.2 RDFS与RDF的区别 2. RDFS的基础概念2.1 类&#xff08;Class&#xff09;2.2 属性&#xff08;Property&#xff09;2.3 关系&#xff08;Relation&#xff09;2.4 定义域&#xff08;Domain&#xff09;2.5 值域&…

光滑曲线弧长公式的推导

前言 本文将介绍如何用定积分计算空间中一段光滑曲线的弧长。首先我们会给出光滑曲线以及曲线弧长的定义&#xff0c;然后从定义出发&#xff0c;用求黎曼和的思想推导出弧长的计算公式。 光滑曲线的定义 设平面曲线的参数方程为 { x x ( t ) , y y ( t ) , t ∈ [ T 1 , …

设计一个基于Spring Boot开发的电商网站,部署在阿里云上

系统架构设计&#xff0c;包含网络、部署架构等关键信息&#xff0c;要保证系统的高可用。设计中请明确指出使用的产品名称。 为了设计一个基于Spring Boot开发的电商网站系统架构&#xff0c;并确保其高可用性&#xff0c;以下是一个详细的系统架构设计方案&#xff0c;包含网…

C语言技巧之有条件的累加

什么叫有条件的累加&#xff1f; 主要是依靠循环&#xff0c;一般形式是一个在循环里面遍历&#xff0c;另一个只有达到一定的条件才会累加&#xff08;移动到下一个变量&#xff09;&#xff0c;从言语也能看出来&#xff0c;主要是用在字符串和数组里面的&#xff0c;毕竟链表…

Python基于Django的web漏洞挖掘扫描技术的实现与研究(附源码,文档说明)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

数据结构-c++

数据结构 链表设计链表1.进制转换2.顺序表逆置3.链表转置 栈栈的实现 队列队列实现1.逆置队列 二叉树遍历顺序1.树的深度2.左右子树交换3.输出并求出非叶子节点个数 图1.邻接矩阵转换成临界表2.深度优先搜索 查找折半查找算法 排序快速排序 链表 设计链表 #include <iostr…

简单发布一个npm包

将自己封装的组件上传到 npm&#xff0c;并在其他项目中下载并使用&#xff0c;是一个非常有用的技能。看完下面这些你就可以自己完成从封装组件到上传 npm 并使用的全过程。 1: 封装组件 首先&#xff0c;你需要创建一个符合标准的 npm 包。假设你已经写好了组件代码&#xf…

24.try块怎么用 C#例子

这是一个用英语写的try-catch例子 简单来说就是一个try&#xff0c;try里面的代码可能会出错&#xff0c;然后有两个catch&#xff0c;规定了具体的错误是什么 如果发生相应的错误&#xff0c;就会把错误信息存到err里&#xff0c;err.Message是一个字符串格式的提示信息&…

记录命令行操作树莓派Wifi的方式

打开WiFi rfkill unblock wlan 关闭WiFi rfkill block wlan 设置可连接的WiFi 方法一&#xff08;bullseye及以前版本才可用&#xff0c;bookworm版本&#xff09; sudo nano /etc/wpa_supplicant/wpa_supplicant.conf network{ssid"wifi_name"psk"wifi_pas…

【Axure高保真原型】计时秒表

今天和大家分享计时原型模板&#xff0c;效果包括&#xff1a; 点击计时按钮&#xff0c;可以开始或者停止计时&#xff1b; 秒针会自动运转&#xff0c;时长会自动记录&#xff1b; 右侧表格会记录每一次开始和结束时间&#xff0c;并计算该段时长&#xff1b; 点击重置按钮…

随机变量是一个函数-如何理解

文章目录 一. 随机变量二. 随机变量是一个函数-栗子(一对一)1. 掷骰子的随机变量2. 掷骰子的随机变量&#xff08;求点数平方&#xff09;3. 抛硬币的随机变量4. 学生考试得分的随机变量 三. 随机变量是一个函数-理解(多对一) 一. 随机变量 随机变量就是定义在样本空间上的函数…

FOC软件 STM32CubeMX 使用

1、安装-及相关软件版本 展示版本注意事项&#xff1a;keil MDK和STM32CubeMX版本至少要大于等于图中版本。 2、 Motor Profiler 5.2.0使用方法 主要测试&#xff0c;电感、电流、最大速度等。 获得参数以后再使用控制台准确的控制。 3、MotorControl Workbench 5.2.0使用方法…

科技创新 数智未来|清科·沙丘投研院走进竹云

12月20日&#xff0c;清科沙丘投研院带领企投家团队走进竹云交流分享&#xff0c;聚焦技术创新、企业数字化管理、行业前沿应用案例等热点议题&#xff0c;深入探讨数字技术如何点燃企业高质量发展的澎湃动力&#xff0c;共话企业数字化、智能化发展之道。 达晨财智股权管理部…

Python机器学习笔记(十四、凝聚聚类和DBSCAN)

凝聚聚类 凝聚聚类&#xff08;agglomerative clustering&#xff09;指的是许多基于相同原则构建的聚类算法&#xff0c;这一原则是&#xff1a;算法首先声明每个点是自己的簇&#xff0c;然后合并两个最相似的簇&#xff0c;直到满足某种停止准则为止。 scikit-learn中实现…

题解:CF373B Making Sequences is Fun

思路 我们拿到这一题可以发现&#xff0c;可以使用二分查找。 bool check(ll x) {ll sum0;for(int im;i<mx;i){sumsumk*h(i);if(sum>n){return 0;}}return 1; }如果 check 函数这样写&#xff0c;那代码就算用了二分优化也一定会超时。那我们可以考虑如何优化 check 函…