new的返回值检查
2016-01-28 16:38
274 查看
我们知道,使用malloc/calloc等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即是检查分配内存的操作是否成功),这是良好的编程习惯,也是编写可靠程序所必需的。但是,如果你简单的把这一招应用到new上,那就不一定正确了。我经常看到类似这样的代码:
int* p = new int[SIZE];
if(p==0) //检查p是否空指针
return -1;
//其他代码
其实,这里的 if( p==0 )完全是没啥意义的。C++里,如果new分配内存失败,默认是抛出异常的。所以,如果分配成功,p==0就绝对不会成立;而如果分配失败了,也不会执行if( p==0 ),因为内存分配失败时,new就会抛出异常跳过后面的代码。如果你想检查new是否成功,应该捕捉异常:
try{
int* p = new int[SIZE];
//其他代码
}catch( const bad_alloc& e ){
return -1;
}
据说一些老的编译器里,new如果分配内存失败,是不抛出异常的(大概因为那时C++还没加入异常机制),而是和malloc一样,返回空指针。不过,我从来都没有遇到过new返回空指针的情况。
当然,标准的C++亦提供了一个方法来抑制new抛出异常,而返回空指针:
int* p = new (std::nothrow) int; //这样,如果new失败了,就不会抛出异常,而是返回空指针
if( p==0 )//如此这般,这个判断就有意义了
return -1;
//其他代码
文章出处:http://tech.ddvip.com/2009-05/1242375623119337.html
int* p = new int[SIZE];
if(p==0) //检查p是否空指针
return -1;
//其他代码
其实,这里的 if( p==0 )完全是没啥意义的。C++里,如果new分配内存失败,默认是抛出异常的。所以,如果分配成功,p==0就绝对不会成立;而如果分配失败了,也不会执行if( p==0 ),因为内存分配失败时,new就会抛出异常跳过后面的代码。如果你想检查new是否成功,应该捕捉异常:
try{
int* p = new int[SIZE];
//其他代码
}catch( const bad_alloc& e ){
return -1;
}
据说一些老的编译器里,new如果分配内存失败,是不抛出异常的(大概因为那时C++还没加入异常机制),而是和malloc一样,返回空指针。不过,我从来都没有遇到过new返回空指针的情况。
当然,标准的C++亦提供了一个方法来抑制new抛出异常,而返回空指针:
int* p = new (std::nothrow) int; //这样,如果new失败了,就不会抛出异常,而是返回空指针
if( p==0 )//如此这般,这个判断就有意义了
return -1;
//其他代码
文章出处:http://tech.ddvip.com/2009-05/1242375623119337.html
相关文章推荐
- Android中如何解析JSON数据
- route add 没文化真可怕
- 电缆线径的选择
- Xcode配置OpenGL
- UITableView中Cell重用机制导致内容重复解决方法
- 飞控控制方法学习
- 数列分段
- 【spring mvc (三)】spring 容器
- Android中如何解析XML数据
- mongodb学习1(基础知识)
- 使用fragment,editvView ,listView,出现软键盘遮挡
- AES SHA-1 SM3 MD5
- 记某图片下载器破解笔记之增加试用次数
- CentOS 6.5上安装python2.7、pip以及Python命令行补全和yum冲突解决
- 转 -- 求一个二进制数值中的1的个数
- C#中WinForm窗体的单例模式,避免窗体被实例化多次
- 移动端 h5开发相关内容总结——CSS篇
- 99. Recover Binary Search Tree
- PM应知晓的互联网产品研发改进之路
- Toast避免重复点击的简单解决