先介绍不能使用make_shared的场景:
1.当你需要定制一个删除器,例如采用shared_ptr管理非内存资源或者一个分配在非标准内存区域的对象。这时候不能使用make_shard,它不支持指定删除器;
2.当你正在采用其他代码产生的raw指针(指向你需要处理的对象),直接采用raw指针构造share_ptr对象。
更适合使用make_shared的原因是:
1.用起来更清晰,准确;
2.效率比直接使用raw指针构造更高;
auto sp1 = shared_ptr{ new widget{} };
auto sp2 = sp1;
如下图所示,两次分开的内存分配花销。
auto sp1 = make_shared();
auto sp2 = sp1;
如下图所示,make_shared只要一次简单的内存分配花销。降低了内存花销,包括内存碎片的产生,提高高速缓存性能。
3.避免明确使用new;
4.避免异常安全问题。
void sink( unique_ptr< widget >, unique_ptr< gadget > );
sink( unique_ptr< widget >{new widget{}}, unique_ptr< gadget >{new gadget{}} ); // Q1: do you see the problem?
c++参数的执行顺序不确定,如果先执行new widget,当执行new gadget抛出异常,widget出现内存泄漏。
sink( make_unique< widget >(), unique_ptr< gadget >{new gadget{}} );
同样出现内存泄露 如果先执行new gadget,当执行make_unique< widget >出现异常的时候,gadget出现内存泄露。
sink( make_unique< widget >(), make_unique< gadget >() ); // exception-safe
使用raw指针和make_shared创建shared_ptr对象,优先使用make_shared,unique_ptr也一样
最新推荐文章于 2024-11-28 11:23:39 发布