C语言new操作的安全性分析
对于学习过C语言的朋友应该都知道,使用malloc/calloc等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即检查分配内存的操作是否成功),这是良好的编程习惯,也是编写可靠程序所必需的。但是,如果你简单地把这一招应用到new上,那可就不一定正确了。我经常看到类似这样的代码:
int*p=newint[MAXSIZE] if(p==0)//检查p指针是否为空 return-1; //othercode
其实,这里的if(p==0)完全没有意义的。C++里,如果new分配内存失败,默认是抛出异常的。所以,如果分配成功,p==0就绝对不会成立;而如果分配失败了,也不会执行if(p==0),因为分配失败时,new就会抛出异常跳过后面的代码。如果你想检查new是否成功,应该捕捉异常:
try { int*p=newint[MAXSIZE] } catch(bad_alloc&exp) { cerrr<<exp.what()<<endl; }
但是有的程序员并不习惯捕捉异常,标准C++也提供了一种方法不抛出异常而返回空指针。
int*p=new(std::nothrow)int[MAXSIZE] if(p==0)//检查p指针是否为空 return-1; //othercode