C++中new申请内存失败的正确处理

今天组内调来了一个架构组的大牛,结果一来就给我的代码找出了一个问题。唉,还是学艺不精啊。
问题如下:通常我们在使用C++的new的时候,都是这样用的:

char *temp = NULL;
temp = new char[1000];
if(temp == NULL)
{
    return false;
}

初看起来似乎没有问题,我们来做个测试,测试代码如下:

int main(int argc,char* argv[])
{
    char *test=NULL;
    while(1)
    {
        test = NULL;
        test = new char[1000000];
        if(test == NULL)
        {
            printf("I am wrong\n");
            break;
        }
    }
    printf("I am ok!\n");
    return 0;
}

执行结果如下:

错误new

可见当new操作符申请不了内存的时候,并不会返回NULL,而是直接异常了。所以代码应该如下:

int main(int argc,char* argv[])
{
    char *test=NULL;
    while(1)
    {
        try
        {
        test = new char[1000000];
        }
        catch(...)
        {
            printf("I am wrong\n");
            break;
        }
    }
    printf("I am ok!\n");
    return 0;
}

运行结果如下:

正确new

可见,程序捕捉的到了异常,并正常退出。
小细节通常引发大问题,有些东西确实不能想当然啊……

另外说明一点,C++里面是没有finally的哦~
(以上代码均由window下g++ 3.4.5编译通过)

版权所有,转载请注明出处。http://www.vimer.cn





原创文章,版权所有。转载请注明:转载自Vimer的程序世界 [ http://www.vimer.cn ]

本文链接地址: http://www.vimer.cn/?p=817

5 个评论 在 “C++中new申请内存失败的正确处理”

  1. turygo 说:

    老版本的编译器在new失败的情况下面的确是会赋值null的,不过那个已经是很久以前的事情鸟,现在如果想让一开始的代码正常工作,可以使用new(std::nothrow)来代替new

    [回复]

    Dante 回复:

    刚测试过,果然如此;多谢tury指教~~~

    [回复]

  2. greenerycn 说:

    MSDN详解:http://msdn.microsoft.com/en-us/library/kftdy56f%28VS.71%29.aspx

    另一份资料
    不要让内存分配失败导致您的旧版 STL 应用程序崩溃
    http://www.microsoft.com/china/msdn/library/security/LegacySTLFix.mspx?mfr=true

    [回复]

    Dante 回复:

    呃,因为在linux下开发,所以现在很少用微软的IDE……

    [回复]

    Dante 回复:

    不过还是谢谢分享啊~~~~

    [回复]

我要评论

*

*