最后更新于 .

今天组内调来了一个架构组的大牛,结果一来就给我的代码找出了一个问题。唉,还是学艺不精啊。
问题如下:通常我们在使用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操作符申请不了内存的时候,并不会返回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;
}


可见,程序捕捉的到了异常,并正常退出。

在centos6上测试了一下,发现会直接显示 "已杀死",无法捕获这个异常,也就是说这种异常会直接导致程序结束。

小细节通常引发大问题,有些东西确实不能想当然啊……

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

Pingbacks

Pingbacks已打开。

Trackbacks

引用地址

评论

  1. turygo

    turygo on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  2. greenerycn

    greenerycn on #

    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

    Reply

    1. Dante

      Dante on #

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

      Reply

    2. Dante

      Dante on #

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

      Reply

发表评论