一直以来我都在写着这样的代码
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