Как предотвратить сбой calloc сбой моей программы? - PullRequest
2 голосов
/ 26 марта 2012

Как я могу предотвратить следующий программный сбой моей программы?

::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 ]

5 голосов
/ 26 марта 2012

Похоже, что это ошибка в Microsoft calloc (она должна возвращать ноль, а не крах):

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

Так что вам нужно использовать более новую версию их среды выполнения C.

0 голосов
/ 26 марта 2012

Если вы используете malloc, вы можете просто if (x == NULL) {return GetLastError ();}

Это не настоящий ответ, потому что я предложил другую функцию, но она должна работать. Также проверьте SetErrorMode

...