以前动态申请内存,申请完后,总要判断指针是否为空,比如
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