C++ 异常—常见的错误处理问题

内存分配错误
    如果无法分配内存,new和new[]的默认行为是抛出bad_alloc类型的异常,这个类型在<new>头文件中定义。代码应该捕捉这些异常,并正确处理异常。
    不可能把对new和new[]的调用都放在try/catch中,但至少在分配大块内存时应这么做。下面示例演示了如何捕获内存分配异常:

try{
    Ptr=new int[ numInts];
} catch(const bad_alloc &e) {
   cerr<<__FILE__<<”(”<<__LINE__<< “):Unable to allocate memory: ”<<e.what()<<endl;
   //Handle memory allocation failure.
   return;
}



    注意上面的代码使用了预定义的预处理符号__FILE__和__LINE__,这两个符号将被文件名称和当前行号替换掉,从而使调试更为容易。
    注意:这个示例向cerr输出了一条错误信息,这样做的前提是假定程序在控制台模式下运行。在GUI应用程序中通常不需要控制台,此时应该以GUI特定的方式向用户显示错误信息。
当然,可以用一个try/catch块在程序中高层批量处理许多可能的新错误,如果这样做对程序有效的话。
另一个考虑是记录错误时可能会尝试分配内存,如果new失败,可能连记录错误信息的内存都没有。
不抛出异常的new
    如果不喜欢异常,可以回到旧的C模式:在这种模式下,如果无法分配内存,内存分配例程将返回一个空指针。C++提供了new和new[]的nothrow版本,如果内存分配失败,将返回nullptr,而不是抛出异常,使用语法new(nothrow)而不是new可以做到这一点,如下所示:
ptr=new(nothrow)int[numInts];
If(ptr==nullptr){
 Cerr<<__FILE__<<”<”<<__LINE__<<”): Unable to allcate memory!”<<endl;
//Handle memory allocation failure.
return;
}


这一语法看上去有点奇怪:确实需要使用nothrow,就像这是new的一个参数一样。
定制内存分配失败的行为:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值