内存分配错误
如果无法分配内存,new和new[]的默认行为是抛出bad_alloc类型的异常,这个类型在<new>头文件中定义。代码应该捕捉这些异常,并正确处理异常。
不可能把对new和new[]的调用都放在try/catch中,但至少在分配大块内存时应这么做。下面示例演示了如何捕获内存分配异常:
注意:这个示例向cerr输出了一条错误信息,这样做的前提是假定程序在控制台模式下运行。在GUI应用程序中通常不需要控制台,此时应该以GUI特定的方式向用户显示错误信息。
当然,可以用一个try/catch块在程序中高层批量处理许多可能的新错误,如果这样做对程序有效的话。
另一个考虑是记录错误时可能会尝试分配内存,如果new失败,可能连记录错误信息的内存都没有。
不抛出异常的new
如果不喜欢异常,可以回到旧的C模式:在这种模式下,如果无法分配内存,内存分配例程将返回一个空指针。C++提供了new和new[]的nothrow版本,如果内存分配失败,将返回nullptr,而不是抛出异常,使用语法new(nothrow)而不是new可以做到这一点,如下所示:
这一语法看上去有点奇怪:确实需要使用nothrow,就像这是new的一个参数一样。
定制内存分配失败的行为:
如果无法分配内存,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;
}
注意:这个示例向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的一个参数一样。
定制内存分配失败的行为: