1.70、make_shared函数的优点,缺点?
优点
- • 减少内存分配次数:
make_shared
只进行一次内存分配,将对象和控制块(引用计数结构)合并在一块连续内存中分配,而直接用shared_ptr<T>(new T)
至少两次分配(对象和控制块分开),从而降低了系统开销,提高了性能。 - • 异常安全:
make_shared
在对象构造过程中如果抛异常,不会导致内存泄漏,因为它在内部完成了对象构造和智能指针控制块的原子操作,避免了裸指针暴露的风险。 - • 缓存友好:由于对象和控制块连续存储,访问引用计数和对象时缓存命中率更高,减少缓存未命中的次数,提升运行效率。
缺点
- • 构造函数访问限制:
make_shared
要求调用的构造函数必须是公有的,无法直接用于私有或受保护构造函数的类。这限制了在某些设计模式(如工厂模式、单例模式)中使用make_shared
,只能使用shared_ptr<T>(new T)
或其他变通手段。 - • 内存释放时机延迟:由于
make_shared
将对象和控制块放在同一内存块,weak_ptr
持有控制块时,即使所有shared_ptr
已经销毁,内存也不会立即释放,直到最后一个weak_ptr
销毁。这在对内存回收时效要求高的场景可能导致内存滞留,需特别注意。
总结来说,make_shared
是创建shared_ptr
的首选方式,因其高效和安全,但在涉及私有构造函数或对内存释放时机敏感的场景下,需要权衡使用或采用其他方案。
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1443
文章版权归作者所有,未经允许请勿转载。
THE END