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>());