std::make_shared有什么好处?

为什么使用std::make_shared,std::make_shared有什么好处?

更美观的代码

std::shared_ptr<Node> ptr(new Node);
std::shared_ptr<Node> ptr = std::make_shared<Node>();

更高的效率

std::shared_ptr<Node> ptr(new Node);

上面的代码存在两次内存分配

1:new Node

2:为ptr分配控制块的内存用于存放引用计数等信息

如果使用std::make_shared只会存在一次内存分配,因为它会一次性申请足够大的空间用于存储Node和控制块

更安全的代码

void fun(const std::shared_ptr<Node>& node1, const std::shared_ptr<Node>& node2){
   // TODO
}
func(std::shared_ptr<Node>(new Node), std::shared_ptr<Node>(new Node));

上面的代码执行顺序很有可能是

1:new Node

2:new Node

3:std::shared_ptr赋值

4:std::shared_ptr赋值

因此,如果在第二次new Node时发生异常,此时第一次的Node因还未来得及赋值给std::shared_ptr造成了内存泄漏。

正确的做法是

fun(std::make_shared<Node>(), std::make_shared<Node>());