2012-03-26 214 views
2

如何防止以下代码崩溃我的程序?如何防止calloc失败导致我的程序崩溃?

::MessageBox(NULL, L"before", NULL, MB_OK); 
void* x = ::calloc(1, -1); 
::MessageBox(NULL, L"after", NULL, MB_OK); 

当我运行这段代码我得到的消息框“之前”,然后(“本经”永远不会出现的消息框)与“未处理的win32异常”的程序崩溃。

我知道calloc的参数正在通过请求太多的内存使它崩溃!我想知道的是如何防止崩溃,使我得到控制权,并可以通过其他方式处理内存不足?

(Windows XP中的Visual Studio 2005)

+2

我故意传递一个不可能的大小给calloc强制它失败。我试图处理这种情况,当我的程序由于系统内存不足而失败时。这只是模拟这种情况! – user1292915 2012-03-26 11:54:06

+1

本着同样的精神,好的bug报告包含了“期望的行为”,你应该说你期待'calloc()'返回NULL,而不是让程序崩溃。这可以为您节省读过快的用户的评论。 – 2012-03-26 11:59:20

+0

看起来像一个错误,无论如何:http://connect.microsoft.com/VisualStudio/feedback/details/356599/calloc-crashes-if-total-size-heap-maxreq – 2012-03-26 12:02:03

回答

0

如果您使用malloc你可以,如果(X == NULL){返回GetLastError函数();}

它不是一个真正的答案,因为我sugested另一个功能,但它应该工作。同时检查SetErrorMode

+0

我试过SetErrorMode。它摆脱了Windows“未处理的win32异常”消息框,但该程序仍然崩溃。 :(即:你得到“之前”的消息框,但“之后”消息框从不出现。使用malloc工程虽然!谢谢。 – user1292915 2012-03-26 12:13:10

+0

不要忘了释放你的缓冲区然后 – user877329 2012-03-26 12:17:58