一直以来我都在写着这样的代码
char* buf = new char[1024];
if(NULL == buf){
printf("new failure\n");
}
可new失败以后真的会返回NULL吗?写了个例子测试一下:
#include <stdlib.h>
#include <stdio.h>#define BUF_SIZE (100*1024*1024)
int main(int argc,char** argv){
int i = 0;
for(;i < 100;++i){
char* buf = NULL;
//buf = (char*)malloc(BUF_SIZE);
buf = new char[BUF_SIZE];
if(NULL != buf){
printf("malloc success i = %d\n",i);
}
else{
printf("malloc fail i = %d\n",i);
}
}
return 0;
}
编译一下:$ g++ main.cpp -o new ,然后执行,结果如下:
前29次new都执行成功了,在第30次程序并没有输出“malloc fail”,而是dump了。
在来看一下c中最常用的的malloc,在失败时返回什么,修改一下以上代码,编译执行,结果如下:
输出结果和我们预期一样,看一下malloc的man手册,果然是失败时返回NULL。
RETURN VALUE
For calloc() and malloc(), the value returned is a pointer to the allo-
cated memory, which is suitably aligned for any kind of variable, or
NULL if the request fails.
其实,c++中当new不能分配足够的内存时,默认动作是抛出bad_alloc异常,因此,修改代码如下:
#include <stdlib.h>
#include <stdio.h>#define BUF_SIZE (100*1024*1024)
int main(int argc,char** argv){
int i = 0;
for(;i < 100;++i){
char* buf = NULL;
//buf = (char*)malloc(BUF_SIZE);
try{
buf = new char[BUF_SIZE];
}catch(...){
printf("malloc fail i = %d\n",i);
continue;
}
{
printf("malloc success i = %d\n",i);
}
}
return 0;
}
编译执行后,结果同上。
由于new这种默认的特性,当我们的程序负载很高时,如果动态的分配堆内存,很容易照成程序dump,常见的一些做法可以在程序启动之初便将所需的内存预先分配出来,避免在程序运行时动态的分配内存;或者也可以使用set_new_handler函数处理new失败后的情况。更多new
和delete的行为可以参考《effective c++》第8章。
很多时候我们都在理所当然的写程序,而问题往往就出现在这些“理所当然”的地方,我待code如初恋,code虐你千百遍,爱它就去请深入了解它,否则它真的会虐死你。
[完] 2014-6-4 17:36:17 by:TMDJoJo
c++ new失败后做了什么?