条款16、17,使用new的时候注意事项

要成对使用new和delete

这个可以参考我的这篇内存构造
这条款需要记住的就是,到写代码时只能按照下面的格式:

T* p = new T();
delete p;
//
T* p = new T[100];
delete [] p;

以独立语句将new对象置于智能指针

这里书中举了一个小例子

#include <memory>
class Widget;
int Priority();
void Process(shared_ptr<Widget> para, int num);
//下面这种方式不行,因为shared_ptr的构造函数是explicit的
//Process(new Widget(), Priority());
Process(shared_ptr<Widget>(new Widget()), Priority());

理论认为执行流程:

  1. new Widget()
  2. shared_ptr()
  3. Priority()

上面这段代码有个问题,C++编译器不保证参数执行顺序, 所以会出现下面的离谱事件:

  1. new Widget()
  2. Priority()
  3. shared_ptr()

编译器除了保证你Widget构造在shared_ptr构造之前,对于Priority不保证,所以当Priority()挂掉的时候,new Widget出来的资源压根没有进入资源管理类,为了避免这种问题:

shared_ptr<Widget> tmp(new Widget()); //以独立的语句将new的对象置于智能指针,这个以前真没留意过。
Process(tmp, Priority());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值