免费网站注册com罗湖网站公司

张小明 2026/1/10 15:38:54
免费网站注册com,罗湖网站公司,wordpress中文建站,北京网络销售大家好#xff0c;我是小康。 C为什么推荐使用 make_shared 而不是 new 构造 shared_ptr? 看到这个问题,我想起了之前帮同事定位的一个线上bug。那是一个偶发的内存泄漏,最后追查发现就是因为不当使用 shared_ptr(new T()) 导致的异常安全问题。当时如果用了 make_shared,这…大家好我是小康。C为什么推荐使用 make_shared 而不是 new 构造 shared_ptr?看到这个问题,我想起了之前帮同事定位的一个线上bug。那是一个偶发的内存泄漏,最后追查发现就是因为不当使用shared_ptr(new T())导致的异常安全问题。当时如果用了make_shared,这个bug根本不会出现。所以今天就系统地聊聊这个看似简单、实则暗藏玄机的话题。简单说:性能更好、更安全、代码更简洁。作为一个写了多年C的老司机,我见过太多因为不理解make_shared和new的区别而踩坑的代码。 下面我会从原理到实践,把这个问题讲透。一、核心区别:一次分配 vs 两次分配先上结论:这是最重要的区别。使用 new 的方式:std::shared_ptrWidgetsp(newWidget());这种方式至少需要两次内存分配:一次为 Widget 对象分配内存,另一次为 shared_ptr 的控制块(存储引用计数等信息)分配内存。内存布局大概是这样的:[Widget对象] --- 第一次分配 ... [控制块(引用计数等)] --- 第二次分配使用 make_shared 的方式:autospstd::make_sharedWidget();make_shared 通常只执行一次内存分配,将对象和控制块放在连续的内存块中。[控制块 Widget对象] --- 一次分配搞定性能提升有多大?减少一次内存分配/释放操作减少内存碎片提升缓存局部性(控制块和对象在一起,CPU缓存命中率更高)在高性能场景下,这个差异是相当可观的。如果你的程序频繁创建 shared_ptr,这个优化积累起来效果明显。二、异常安全性:这个更致命来看一个经典的坑:voidprocessWidget(std::shared_ptrWidgetsp,intpriority);// 调用方式1:使用 new (危险!)processWidget(std::shared_ptrWidget(newWidget()),computePriority());// 调用方式2:使用 make_shared (安全)processWidget(std::make_sharedWidget(),computePriority());问题出在哪?在第一种方式中,如果 computePriority() 抛出异常,可能导致内存泄漏。为什么?因为C对函数参数的求值顺序是未定义的,可能的执行顺序:new Widget()- 分配内存computePriority()- 抛出异常!std::shared_ptrWidget(...)- 永远不会执行结果:Widget 对象被分配了,但 shared_ptr 还没构造,内存泄漏!而 make_shared 是异常安全的,因为它在单个操作中完成内存分配和 shared_ptr 构造。三、代码简洁性// 繁琐且容易出错std::shared_ptrSomeVeryLongTypeNamesp1(newSomeVeryLongTypeName(arg1,arg2,arg3));// 简洁优雅autosp2std::make_sharedSomeVeryLongTypeName(arg1,arg2,arg3);不需要重复类型名称,使用auto一步到位。代码可读性和维护性都更好。四、make_shared 的局限性当然,make_shared也不是万能的,有几个场景必须用new:1. 需要自定义删除器// make_shared 不支持自定义删除器autospstd::shared_ptrFILE(fopen(file.txt,r),fclose);2. 构造函数是私有的make_shared 要求构造函数必须是公有的,因为它不是类的成员函数。classSingleton{private:Singleton(){}public:staticstd::shared_ptrSingletoncreate(){// 这里不能用 make_sharedreturnstd::shared_ptrSingleton(newSingleton());}};3. weak_ptr 生命周期问题如果有 weak_ptr 长期持有引用,使用 make_shared 可能导致对象内存无法及时释放,因为对象和控制块在同一内存块中。举个例子:autospstd::make_sharedHugeObject();// 假设这个对象很大std::weak_ptrHugeObjectwpsp;sp.reset();// 对象被销毁,但...// 只要 wp 还活着,整个内存块(包括 HugeObject 的空间)都无法释放!如果用new方式,对象内存和控制块分开,对象销毁后就能立即释放内存。五、最佳实践总结默认情况下,优先使用 make_shared:autospstd::make_sharedT(args...);只有在以下情况考虑 new:需要自定义删除器需要调用私有/保护构造函数对象很大 有长生命周期的 weak_ptr需要使用大括号初始化(C20前的限制)六、补充:类似的建议对于unique_ptr,也有类似的建议:// 推荐autoupstd::make_uniqueT(args...);// 而不是std::unique_ptrTup(newT(args...));原因相同:异常安全 代码简洁。写在最后看完这篇回答,你可能对 C 的智能指针有了更深的理解。但坦白说,玩C,光了解C语言特性远远不够的,一定要多做项目。纸上得来终觉浅,绝知此事要躬行。只有在实际项目中遇到过内存泄漏、野指针、性能瓶颈,你才能真正理解为什么要用智能指针,为什么要用 make_shared。不知道做啥项目的朋友可以看我最近开设的C项目实战课程:从7月到现在,我陆续完成了9个C硬核项目实战课程,已经带领230同学从零开始实现这些项目。这些同学中有985、211的,也有普通本科的,大家都收获满满。现有课程列表:线程池- 理解多线程编程的基础高性能日志库- 学习异步IO和性能优化高性能内存池- 深入理解内存管理多线程下载工具- 综合运用网络编程和并发控制MySQL连接池- 掌握数据库连接管理内存泄漏检测器- 实战内存管理和调试技术ReactorX项目- 学习高性能网络编程框架无锁栈无锁队列(SPSC/MPMC)- 深入无锁编程和并发数据结构工业级智能指针(shared_ptr)- 从零实现 shared_ptr,彻底理解引用计数和智能指针的内部机制每个项目都是从0到1手把手带你实现,不只教你怎么用,更教你为什么这么设计,如何优化性能,怎么处理边界情况。对C项目实战感兴趣的同学可以加我微信详聊jkfwdkf备注[项目实战]。觉得有帮助的话,点个赞和关注再走吧~ 你的支持是我持续输出优质内容的动力!其他硬核C项目实战从Reactor到网络库10天打造生产级C高性能网络库网上的 shared_ptr 都是玩具我用半个月造了个工业级的 !手把手带你实现MPMC无锁队列6天从Facebook Folly到自研Thunder QueueC无锁编程进阶实战手把手打造极速 SPSC 队列C无锁编程终极实战手把手带你实现工业级无锁栈ReactorX项目火了腾讯/字节面试官都在问的Reactor模式终于有人讲透了被内存泄漏折磨疯了的我写了个工具现在同事都来借用…手撸线程池才是C程序员的硬实力7天手把手带你从0到1完整实现从 0 到 1 实现高性能日志库 MiniSpdlog — 这可能是最适合新手的日志系统实战项目 !三周肝出4000行代码我的内存池竟然让malloc破防了性能暴涨7.37倍背后的技术真相手撸4200行MySQL连接池8天带你搞定后端核心组件终于有人把C多线程下载工具讲透了7天手把手带你写出专业级工具
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站建设上市网站简繁体转换js

GEMMA基因组分析工具完整使用手册:从入门到精通 【免费下载链接】GEMMA Genome-wide Efficient Mixed Model Association 项目地址: https://gitcode.com/gh_mirrors/gem/GEMMA 你是否曾经面对海量的基因组数据感到无从下手?想要发现基因型与表型…

张小明 2026/1/2 19:06:05 网站建设

廊坊网站建设廊坊网络公司驻梦企业简介ppt模板

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个交互式Java学习项目,通过控制台输出演示Flux基础:1. 从集合创建Flux;2. 使用interval创建定时序列;3. map/filter简单转换&a…

张小明 2026/1/2 23:57:49 网站建设

网站的搜索框如何做为违法网站做推广进去要几年

视频PPT提取完整指南:3步实现自动化课件整理 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 想要从视频中快速提取PPT课件却苦于手动截图的繁琐?视频PPT提取工…

张小明 2026/1/3 1:59:01 网站建设

网站部署wordpress手机主题下载

TrollRestore终极指南:iOS设备系统应用安全替换解决方案 【免费下载链接】TrollRestore TrollStore installer for iOS 17.0 项目地址: https://gitcode.com/gh_mirrors/tr/TrollRestore TrollRestore是一款专为iOS设备设计的革命性工具,能够帮助…

张小明 2026/1/3 1:11:36 网站建设

餐饮营销型网站案例wordpress 模板 字体大小

谁能想到,天天喝的瑞幸背后藏着一个年产能3万吨的智能烘焙基地‼️ 就在昆山!总投资1.2亿美元的咖啡硬核工厂 真的刷新我对瑞幸的认知了💥走进基地直接被震撼到! ✅全流程自动化开挂 生豆在恒温恒湿仓里待得舒舒服服 机械臂哐哐卸…

张小明 2026/1/2 19:03:12 网站建设

做cg的网站注册公司网上申请入口

Halo邮箱验证实战指南:5分钟搞定安全配置 【免费下载链接】halo 强大易用的开源建站工具。 项目地址: https://gitcode.com/GitHub_Trending/ha/halo 在Halo博客系统中,邮箱验证是保障用户账户安全和内容真实性的重要屏障。本指南将带你快速掌握从…

张小明 2026/1/3 1:25:50 网站建设