C++ new 关键字的 "new" 学习

以前动态申请内存,申请完后,总要判断指针是否为空,比如

const unsigned int iSize = 1024*1024*1024*1.8;
char *p = new char[iSize];
if(!p)
{
  return ; //异常处理
}

一直觉得这样没什么问题(现在想来,真是后怕),今天突然在Effective C++ 上看到,这样写是有大问题的。(当然,malloc/calloc 用上述写法判断返回值,是个好习惯)

C++ 中,new 操作符操作失败,默认是抛出bad_alloc异常(windows 默认的异常处理)的,而不会去判断p == NULL 的情况,也就是说,如果你没有自己的处理new失败的异常处理函数,那么你的程序是肯定要杯具的。

那么,怎么才能让自己的程序稳定(起码不崩溃)呢?

一般有三种做法:

其一就是:

try catch

try
{
char *p = new char[iSize];
}
catch(std::bad_alloc& e)
{
  //异常处理
}

其二就是自己定义异常处理函数

void Exeception()
{
 //异常处理
}

int main(void)
{

  set_new_handler(Exeception);
  char *p = new char[iSize];
  
 return 0;
}

那么new 失败后,程序进入自己的异常处理函数


其三是

char *p = new(std::nothrow) char[iSize]; //如果new 失败,不会抛出异常,二回返回空指针
这样就可以
if(!p)
{
}


更多内容详见Effective C++ 条款7

转载于:https://my.oschina.net/Yuqingmu/blog/392481

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值