高效内存分配
std::shared_ptr<Node> ptr(new Node);
上面的代码存在两次内存分配
- new Node
- 为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));
上面的代码执行顺序很有可能是
- new Node
- new Node
- std::shared_ptr赋值
- td::shared_ptr赋值
如果在第二次new Node时发生异常,第一次的Node因还未来得及赋值给std::shared_ptr造成了内存泄漏。
不保留裸指针,避免内存泄漏
对象和技术在同一内存空间,提高缓存命中率
依赖公共构造函数
内存锁定
shared_ptr是非侵入式的,即计数器的值并不存储在shared_ptr内,它其实是存在在其他地方——在堆上的,当一个shared_ptr由一块内存的原生指针创建的时候(原生内存:代指这个时候还没有其他shared_ptr指向这块内存),这个计数器也就随之产生,这个计数器结构的内存会一直存在——直到所有的shared_ptr和weak_ptr都被销毁的时候,这个时候就比较巧妙了,当所有shared_ptr都被销毁时,这块内存就已经被释放了,但是可能还有weak_ptr存在——也就是说计数器的销毁有可能发生在内存对象销毁后很久才发生。
226-C++shared_ptr和make_shared的优缺点_std::make_shared_sp_13230409636的博客-CSDN博客