使用raw指针和make_shared创建shared_ptr对象,优先使用make_shared,unique_ptr也一样

先介绍不能使用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;
如下图所示,两次分开的内存分配花销。
使用raw指针
auto sp1 = make_shared();
auto sp2 = sp1;
如下图所示,make_shared只要一次简单的内存分配花销。降低了内存花销,包括内存碎片的产生,提高高速缓存性能。
使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值