0

0

C++的make_shared和直接new有什么区别 分析性能优势和内存布局差异

P粉602998670

P粉602998670

发布时间:2025-07-02 09:18:05

|

467人浏览过

|

来源于php中文网

原创

make_shared和直接new的主要区别在于内存分配方式和异常安全性。1. make_shared一次性分配对象和控制块的内存,提高性能并减少内存碎片;而new需要两次分配,分别用于对象和控制块。2. make_shared在异常情况下更安全,避免因构造参数抛出异常导致内存泄漏;而new可能在shared_ptr构造前发生泄漏。3. make_shared不适合存在长期weak_ptr或需自定义内存管理的场景,此时应选择new。

C++的make_shared和直接new有什么区别 分析性能优势和内存布局差异

make_shared和直接new的主要区别在于内存分配方式和异常安全性。make_shared一次性分配对象和控制块的内存,提高了效率并避免了某些异常安全问题。

C++的make_shared和直接new有什么区别 分析性能优势和内存布局差异

性能和内存布局的差异分析:

C++的make_shared和直接new有什么区别 分析性能优势和内存布局差异

使用make_shared可以提高性能,减少内存碎片,并提供更强的异常安全性。理解其内存布局有助于更好地优化C++代码。

立即学习C++免费学习笔记(深入)”;

make_sharednew在内存分配上的差异

make_sharednew在内存分配上的最主要区别在于分配次数和内存布局。使用new创建shared_ptr需要两次内存分配:一次用于对象本身,另一次用于shared_ptr的控制块(引用计数等信息)。而make_shared则通过一次内存分配完成这两个任务,将对象和控制块放在一起。

C++的make_shared和直接new有什么区别 分析性能优势和内存布局差异

这样做的好处是减少了内存分配和释放的开销,因为内存分配本身就是一个相对耗时的操作。此外,由于对象和控制块在同一块连续的内存中,可以减少内存碎片,提高缓存命中率。

异常安全性:make_shared为何更胜一筹

在异常安全性方面,make_shared能避免一种潜在的资源泄漏情况。考虑以下代码:

Figstack
Figstack

一个基于 Web 的AI代码伴侣工具,可以帮助跨不同编程语言管理和解释代码。

下载
shared_ptr ptr(new MyClass(arg1, arg2));

如果arg1的计算成功,但在arg2的计算过程中抛出异常,并且这个异常发生在new MyClass(arg1, arg2)之后、shared_ptr构造之前,那么new分配的内存将会泄漏。因为此时还没有shared_ptr来管理这块内存。

而使用make_shared

auto ptr = make_shared(arg1, arg2);

即使在构造MyClass时抛出异常,由于内存分配和对象构造是原子性的,内存泄漏的风险也会被避免。

make_shared的适用场景和局限性

尽管make_shared有很多优点,但它并非在所有情况下都是最佳选择。一个主要的限制是,当使用shared_ptr管理的对象被weak_ptr引用,且shared_ptr的引用计数降为0时,对象本身占用的内存会被释放,但控制块的内存仍然需要保留,直到所有weak_ptr失效。这意味着如果存在长期存活的weak_ptr,使用make_shared分配的内存可能无法及时释放。

此外,如果类重载了newdelete操作符,make_shared可能无法使用这些自定义的内存管理方式,因为它总是使用标准的内存分配器。

如何选择:make_shared还是new

在选择make_shared还是new时,需要综合考虑性能、异常安全性和内存占用。通常情况下,如果不需要自定义内存管理,且没有长期存活的weak_ptrmake_shared是更好的选择。它可以提供更高的性能和更强的异常安全性。

然而,如果需要自定义内存管理,或者存在长期存活的weak_ptr,那么直接使用new可能更合适。在这种情况下,需要特别注意异常安全性,确保在任何情况下都能正确释放内存。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

274

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

211

2023.12.29

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

10

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

29

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.22

PHP特殊符号教程合集
PHP特殊符号教程合集

本专题整合了PHP特殊符号相关处理方法,阅读专题下面的文章了解更多详细内容。

11

2026.01.22

PHP探针相关教程合集
PHP探针相关教程合集

本专题整合了PHP探针相关教程,阅读专题下面的文章了解更多详细内容。

8

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.4万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号