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】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)

阅读剩余
THE END