首页 >后端开发 >C++ >`make_shared` 与 `shared_ptr`:为什么更高效且异常安全?

`make_shared` 与 `shared_ptr`:为什么更高效且异常安全?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-14 12:19:11494浏览

`make_shared` vs. `shared_ptr`: Why is One More Efficient and Exception-Safe?

make_shared和标准shared_ptr的区别

为什么make_shared更高效?

了解std::make_shared与标准shared_ptr相比的效率,我们来一步步考察一下他们的构建过程

使用标准的shared_ptr构造函数:

std::shared_ptr<Object> p2(new Object("foo"));
  • 执行Object("foo")的堆分配。
  • 使用原始数据创建新的 std::shared_ptr 控制块指针。

使用 std::make_shared:

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
  • std::shared_ptr 控制块和对象实例的单堆分配是已执行。

异常安全

在标准的shared_ptr构造方法中,如果在构造Object期间抛出异常,则不会执行任何清理,留下悬空内存。然而,std::make_shared 保证构造的 Object 和控制块是单个分配的一部分,并且如果抛出异常,将会被清理。

std::make_shared 的缺点

  • 与使用标准的shared_ptr构造函数相比,增加了内存保留:由于std::make_shared执行单个分配,指向的内存无法被释放,直到控制块不再使用。指向对象的弱指针可以使控制块保持活动状态,从而可能导致延长内存保留时间。

以上是`make_shared` 与 `shared_ptr`:为什么更高效且异常安全?的详细内容。更多信息请关注PHP中文网其他相关文章!

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