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

来源:互联网 发布:声音编辑软件 编辑:程序博客网 时间:2024/06/06 14:16
内存分配错误
    如果无法分配内存,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的一个参数一样。
定制内存分配失败的行为:
0 0
原创粉丝点击