std::make_shared和new初始化智能指针的区别
先看代码:
class Base
{public:Base(int num):a(num) {std::cout << "Base() construct" << std::endl;}~Base() {std::cout << "Base() deconstruct" << std::endl;}int Get() {return a;}private:int a;
};void testc()
{std::cout << "******************************" << std::endl;std::cout << "******************************" << std::endl;Base *p;{std::weak_ptr<Base> gw;{auto sp = std::make_shared<Base>(42);gw = sp;p = sp.get();}std::cout << "shared_ptr release, p->a = " << p->Get() << std::endl;}std::cout << "weak_ptr release, p->a = " << p->Get() << std::endl;
}void testd()
{std::cout << "==================================" << std::endl;Base *p;{std::weak_ptr<Base> gw;{std::shared_ptr<Base> sp(new Base(42));gw = sp;p = sp.get();}std::cout << "shared_ptr release, p->a = " << p->Get() << std::endl;}std::cout << "weak_ptr release, p->a = " << p->Get() << std::endl;
}
执行结果如下:
在testc()中,只有weak_ptr生命周期也结束后,Base对象内存才真正被回收,虽然Base在shared_ptr生命周期结束后就执行了析构函数,但对象所占用的内存还未被马上回收。
而在testd()中,由于使用了new分配对象内存,Base对象内存和智能指针控制块内存不在一起,所以当shared_ptr生命周期结束后就释放了Base对象所占内存。
结论:
1、make_shared只分配一次内存,智能指针控制块和管理的对象存在同一块内存里。new初始化智能指针需要调用两次内存分配,一次给控制块分配内存,一次给对象分配内存。
2、异常安全性。当在函数的实参里初始化智能指针,使用new初始化有发生异常安全性的风险,如 function_a(std::shared_ptr ptr1(new int(100)), function_b()); 编译器可能产生代码: 1先new对象,2再执行函数function_b,3最后将new对象的指针赋给智能指针,如果第2步 function_b发生异常退出,将导致内存泄漏。
3、对象内存被延迟回收:当使用了弱指针weak_ptr引用shared_ptr时,使用make_shared初始化因为控制块和对象都在同一块内存里,虽然管理的对象已经执行析构函数,但由于weak_ptr没有释放,导致内存生命周期被意外延长,只有weak_ptr生命周期结束后,整块内存才一起被回收。
相关文章:

std::make_shared和new初始化智能指针的区别
先看代码: class Base {public:Base(int num):a(num) {std::cout << "Base() construct" << std::endl;}~Base() {std::cout << "Base() deconstruct" << std::endl;}int Get() {return a;}private:int a; };void tes…...

无涯教程-JavaScript - ERFC.PRECISE函数
描述 ERFC.PRECISE函数返回x和无穷大之间集成的互补ERF函数。 互补误差函数等于1-ERF(即1-误差函数),由等式给出- $$Erfc(x) \frac {2} {\sqrt {\pi}} \int_ {x} ^ {\infty} e ^ {-t ^ 2} dt $$ 语法 ERFC.PRECISE(x)争论 Argument描述Required/OptionalxThe lower bound…...
2023国赛数学建模C题思路分析 - 蔬菜类商品的自动定价与补货决策
# 1 赛题 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此, 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…...

手写Spring:第1章-开篇介绍,手写Spring
文章目录 一、手写Spring二、Spring 生命周期 一、手写Spring 💡 目标:我们该对 Spring 学到什么程度?又该怎么学习呢? 手写简化版 Spring 框架,了解 Spring 核心原理,为后续再深入学习 Spring 打下基础。在…...
C语言中,字节对齐是一种重要的内存管理概念
C语言中,字节对齐是一种重要的内存管理概念 字节对齐的目的是为了提高内存访问的效率。因为CPU访问内存的最小单位是字节,所以如果数据结构的成员以正确的字节边界对齐,那么CPU就可以直接访问这些成员,而不需要进行额外的内存移动…...

网络丢包问题,敢不敢这样定位?
下午好,我的网工朋友。 所谓丢包,是指在网络数据的收发过程中,由于种种原因,数据包还没传输到应用程序中,就被丢弃了。 这些被丢弃包的数量,除以总的传输包数,也就是我们常说的丢包率。 丢包…...

【漏洞复现】H3C路由器信息泄露任意用户登录
漏洞描述 通过访问特地址得到密码可进行登录。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中…...
随机数算法,SQL
SELECT* FROMprizes_config WHEREweight > ( SELECT FLOOR( RAND() * MAX( weight )) FROM prizes_config ) order by weight asc-- LIMIT 1;记录 id 权重 1 5 2 10 3 50 4 100 找权重最大的那个值,调用rand()函数&#…...
什么是软件测试+软件测试的分类【软件测试】
软件测试 什么是软件? 软件 程序 数据 文档 软件测试的对象有哪些?程序 数据 文档 C/S与B/S架构 C/S:客户端服务器,这种就是我们一定要安装一个客户端才能够用的软件,就叫C/S。比如:微信、qq B/S&am…...
2023国赛C题解题思路:蔬菜类商品的自动定价与补货决策
本次将全程提供国赛C题完整解题思路及代码,同时共享一些国赛论文模板等资料,需要的小伙伴可以关注一下,持续更新!大家也可以关注B站视频:不知名数学家小P 实时更新 本次C题是一道较为简单的统计分析题目,建…...

MIT6.824 Spring2021 Lab 1: MapReduce
文章目录 0x00 准备0x01 MapReduce简介0x02 RPC0x03 调试0x04 代码coordinator.gorpc.goworker.go 0x00 准备 阅读MapReduce论文配置GO环境 因为之前没用过GO,所以 先在网上学了一下语法A Tour of Go 感觉Go的接口和方法的语法和C挺不一样, 并发编程也挺有意思 0x01 MapRed…...
JavaScript 日期 – 如何使用 DayJS 库在 JS 中处理日期和时间
当涉及到在 JavaScript 中处理日期和时间时,开发人员经常发现自己正在努力应对内置对象的复杂性Date。 虽然普通 JavaScript 提供了基本功能,但使用起来可能相当麻烦,尤其是在处理解析、格式化和操作日期时。 这就是像 DayJS 这样的外部库发挥作用的地方,它提供了大量的优…...

Docker基础入门:Docker基础总结篇--超详细
Docker基础入门:Docker基础总结篇[docker3要素、docker安装配置、容器使用、镜像管理发布] 一、Docker 3要素1.1、镜像(Image)1.2、容器(Container)1.3、仓库(Registry)1.4 、总结 二、Docker安…...

对象临时中间状态的条件竞争覆盖
Portswigger练兵场之条件竞争 🦄条件竞争之对象临时中间状态的条件竞争 Lab: Partial construction race conditions🚀实验前置必要知识点 某些框架尝试通过使用某种形式的请求锁定来防止意外的数据损坏。例如,PHP 的本机会话处理程序模块…...

Nodejs 第十四章(process)
process 是Nodejs操作当前进程和控制当前进程的API,并且是挂载到globalThis下面的全局API API 介绍 1. process.arch 返回操作系统 CPU 架构 跟我们之前讲的os.arch 一样 arm、arm64、ia32、mips、mipsel、ppc、ppc64、s390、s390x、以及 x64 2. process.cwd() …...

数据分析因子评分学习
当多个因素影响一个结果时,我们需要综合考虑这些因素分别对结果德影响。因子评分就是用于比较其对结果德影响程度。 文章目录 前言一、案例背景二、解决方案(一)分析思路(二)剔除无关数据(三)求…...

【postgresql 基础入门】数据库服务的管理
数据库服务管理 专栏内容: postgresql内核源码分析手写数据库toadb并发编程 开源贡献: toadb开源库 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤ÿ…...

githubPage部署Vue项目
github中新建项目 my-web (编写vue项目代码) myWebOnline(存放Vue打包后的dist包里面的文件) 发布流程 (假设my-web项目已经编写完成)Vue-cli my-web vue.config.js文件中 const { defineConfig } require(vue/cli-service)…...
【网络编程】网络原来这么简单(更新中)
故事背景:有一天小胖和他的朋友细狗出去吃饭,聊着聊着就聊到了网络,小胖是学校里的编程大佬,而细狗只是个空有求知欲的编程小白。 细狗:胖儿啊,你说计算机是怎么通信的我感觉好抽象啊。为啥别人给我发个消息…...

监控系统典型架构
监控系统典型架构如下: 从左往右看: 采集器是负责采集监控数据的,采集到数据之后传输给服务端,通常是直接写入时序库。 对时序库的数据进行分析和可视化。 告警引擎产生告警事件之后交给告警发送模块做不同媒介的通知。 可视化比…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...