C++11_std::make_shared的优点

2020-02-04  本文已影响0人  JasonLiThirty

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

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

使用原始的new函数创建shared_ptr

使用make_shared创建shared_ptr

make_shared实现异常安全

//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的缺点

上一篇下一篇

猜你喜欢

热点阅读