首页 > 代码库 > c++ new失败后做了什么?

c++ new失败后做了什么?

一直以来我都在写着这样的代码

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