首页 > 后端开发 > C++ > 正文

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

P粉602998670
发布: 2025-07-02 09:18:05
原创
396人浏览过

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_shared与new在内存分配上的差异

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

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

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

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

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

shared_ptr<MyClass> ptr(new MyClass(arg1, arg2));
登录后复制

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

而使用make_shared:

auto ptr = make_shared<MyClass>(arg1, arg2);
登录后复制

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

make_shared的适用场景和局限性

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

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

如何选择:make_shared还是new?

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

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

以上就是C++的make_shared和直接new有什么区别 分析性能优势和内存布局差异的详细内容,更多请关注php中文网其它相关文章!

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

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

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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