【问题标题】:How to prevent calloc failure crashing my program?如何防止 calloc 失败使我的程序崩溃?
【发布时间】:2012-03-26 11:51:38
【问题描述】:

如何防止以下代码使我的程序崩溃?

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

当我运行此代码时,我收到“之前”消息框,然后程序因“未处理的 win32 异常”而崩溃(“之后”消息框永远不会出现)。

我知道 calloc 的 args 通过要求太多内存使其崩溃!我想知道的是如何防止崩溃,以便我重新获得控制权并可以通过其他方式处理内存不足?

(Windows XP、Visual Studio 2005)

【问题讨论】:

  • 我故意将不可能的大小传递给 calloc 以强制它失败。我正在尝试处理由于系统内存不足而导致程序失败的情况。这只是模拟那种情况!!!
  • 本着良好的错误报告包括“预期行为”的精神,您应该说您希望calloc() 返回NULL 而不会导致程序崩溃。这样可以节省阅读速度过快的用户的 cmets。
  • 看起来像一个错误,无论如何:connect.microsoft.com/VisualStudio/feedback/details/356599/…
  • 顺便说一句,::calloc(1, -1) 不是 C。如果你的程序用某种我一无所知的语言做一些应受谴责的事情,那么你已经发现了一个错误,你应该将其报告给编译器的提供者,而不是在这里。
  • 看起来他只是在用 C++ 编译器编译 C(这将使 ::calloc 有效)。

标签: c++ memory crash


【解决方案1】:

看起来这是 Microsoft calloc 中的一个错误(它应该返回 null,而不是崩溃):

http://connect.microsoft.com/VisualStudio/feedback/details/356599/calloc-crashes-if-total-size-heap-maxreq

所以你需要使用他们的 C 运行时的更新版本。

【讨论】:

  • 这是正确的答案。按照链接查看原因(这是 Microsoft 随后修复的 calloc 中的错误)。解决方法是使用 malloc 并自己做 memset!
【解决方案2】:

如果你使用 malloc,你可以 if(x==NULL){return GetLastError();}

这不是一个真正的答案,因为我建议使用另一个功能,但它应该可以工作。还要检查 SetErrorMode

【讨论】:

  • 我试过 SetErrorMode。它摆脱了 Windows“未处理的 win32 异常”消息框,但程序仍然崩溃。 :( 即:您得到“之前”消息框,但“之后”消息框从未出现。但使用 malloc 有效!谢谢。
  • 别忘了释放你的缓冲区
猜你喜欢
  • 1970-01-01
  • 2012-05-11
  • 2013-05-30
  • 2013-03-08
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
相关资源
最近更新 更多