美文网首页
C++11_std::make_shared的优点

C++11_std::make_shared的优点

作者: JasonLiThirty | 来源:发表于2020-02-04 19:40 被阅读0次

视频教程:https://www.bilibili.com/video/av86947941

shared_ptr维护引用计数需要的信息

  • 强引用, 用来记录当前有多少个存活的 shared_ptrs 正持有该对象. 共享的对象会在最后一个强引用离开的时候销毁( 也可能释放).
  • 弱引用, 用来记录当前有多少个正在观察该对象的 weak_ptrs. 当最后一个弱引用离开的时候, 共享的内部信息控制块会被销毁和释放 (共享的对象也会被释放, 如果还没有释放的话).

使用原始的new函数创建shared_ptr

  • 首先是原始的new分配了原始对象, 然后将这个对象传递给 shared_ptr (即使用 shared_ptr 的构造函数) , shared_ptr 对象只能单独的分配控制块。
  • 控制块包含被指向对象的引用计数以及其他,也就是说,控制块的内存是在std::shared_ptr的构造函数中分配的。

使用make_shared创建shared_ptr

  • 如果选择使用 make_shared 的话, 内存分配的动作, 可以一次性完成,因为std::make_shared申请一个单独的内存块来同时存放指向的对象和控制块,这减少了内存分配的次数, 而内存分配是代价很高的操作。
  • 同时,使用std::make_shared消除了一些控制块需要记录的信息,减少了程序的总内存占用。

make_shared实现异常安全

  • 在shared_ptr的使用过程中,不能在函数实参中创建shared_ptr,如下:
//Define
void F(const std::shared_ptr<Lhs>& lhs, const std::shared_ptr<Rhs>& rhs) 
{
  ;
}
//Call
F(std::shared_ptr<Lhs>(new Lhs("foo")),std::shared_ptr<Rhs>(new Rhs("bar")));

C++ 是不保证参数求值顺序, 以及内部表达式的求值顺序的, 所以可能的执行顺序如下:

new Lhs(“foo”))
new Rhs(“bar”))
std::shared_ptr<Lhs>
std::shared_ptr<Rhs>

如果在第2步的时候,发生了异常,第一步申请的 Lhs 对象内存就泄露了,
产生这个问题的核心在于, shared_ptr 没有立即获得裸指针,所以就有可能产生内存泄漏。当然,这个问题是可以这样解决:

auto lhs = std::shared_ptr<Lhs>(new Lhs("foo"));
auto rhs = std::shared_ptr<Rhs>(new Rhs("bar"));
F(lhs, rhs);

但,最推荐的做法是

F(std::make_shared<Lhs>("foo"), std::make_shared<Rhs>("bar"));

因为,申请原始对象和将原始对象裸指针赋值给shared_ptr是在同一个执行序列里,失败的话一起失败,成功就一起成功,这样就能保住创建的原始对象裸指针能安全的存放到std::shared_ptr中

使用make_shared的缺点

  • 创建的对象如果没有公有的构造函数时,make_shared无法使用。
  • 使用make_shared内存可能无法及时回收,对内存要求要的场景需要注意。

相关文章

  • C++11_std::make_shared的优点

    视频教程:https://www.bilibili.com/video/av86947941 shared_ptr...

  • c++ make_shared & shared_ptr

    注 make_shared & shared_ptr make_shared 和 shared_ptr 的用处 通...

  • C++11 make_shared

    make_shared的使用: 尽量使用make_shared初始化 C++11 中引入了智能指针, 同时还有一个...

  • The architecture of bitshares ap

    Local api call RPC Client: auto apic = std::make_shared

  • c++11 条款21:尽量使用std::make_unique和

    让我们从对齐std::make_unique 和 std::make_shared这两块开始。std::make_...

  • ★14.关于std--shared_ptr

    注意事项 永远只用make_shared或make_unique的方式初始化和构造,因为效率高。 类型...

  • C++11 实现make_unique

    C++ 11标准库中默认实现了make_shared,但是没有给出一个make_unique的实现。本例实现mak...

  • 【优点】你的优点是什么?

    文/明镜小书生 做出个人成绩,是每一个人刻在骨子里的追求。只是在成长中,背景、环境和意识的不同,导致每个人对于成绩...

  • 关注优点 学习优点

    在一个公司里,周围的同事都有优点,不管是工作上还是生活上,一定都能找到优点,但缺点也会有,而你要做的是关注这些人的...

  • 优点

    上进而又没有野心的男生真的很难得 见过很多不上进的男孩子,做朋友其乐融融但若是作为另一半考虑的话大概时间久了我会有...

网友评论

      本文标题:C++11_std::make_shared的优点

      本文链接:https://www.haomeiwen.com/subject/fljdxhtx.html