在 C++11 中,提供了 make_shared 函数来创建共享指针,它的底层是一个模板函数,可以接受任何类型的参数,并返回一个指向该类型对象的共享指针。
std::shared_ptr<T> make_shared< T >( Args&&... args );
特点
它可以将控制块和对象一起分配在堆上,从而避免了两次内存分配,并减少了引用计数的内存开销,shared_ptr 会进行两次new,一个是存放对象,另一个用来存放强智能指针以及肉智能指针的引用计数,所以make_shared相对于直接使用 new 或 shared_ptr 更为高效。
优点
- 内存分配效率高,只需要new一块出来;
- 防止内存泄漏的风险,针对shared_ptr,如果第一块内存开辟成功,但是引用计数的内存开辟失败,也就是对象创建失败了,这样就会造成资源泄漏的问题;
缺点
- make_shared无法自定义删除器,默认的是delete操作,对于文件等资源是不能使用delete的,而使用shared_ptr可以自定义删除器;
- 在make_shared会导致托管的资源延迟释放,即就是现在没有强智能指针指向资源了,资源也无法释放,因为两者是一块内存,要释放是一起释放的。在 shared_ptr中只要所有的强智能指针全部出作用域了,资源例如new int(10)一定会马上进行释放,不在意弱智能指针是否在观测,当弱智能指针也不再观测的时候会释放第二块内存,这对于内存要求高的场景来说, 是一个需要注意的问题。