今天组内调来了一个架构组的大牛,结果一来就给我的代码找出了一个问题。唉,还是学艺不精啊。
问题如下:通常我们在使用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编译通过)
turygo on #
老版本的编译器在new失败的情况下面的确是会赋值null的,不过那个已经是很久以前的事情鸟,现在如果想让一开始的代码正常工作,可以使用new(std::nothrow)来代替new
Reply
Dante on #
刚测试过,果然如此;多谢tury指教~~~
Reply
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
Dante on #
呃,因为在linux下开发,所以现在很少用微软的IDE……
Reply
Dante on #
不过还是谢谢分享啊~~~~
Reply