Когда _malloca не может выделить память на кучу
Когда alloca не может выделить память в куче, это создает структурированное исключение stackru и остановка программы с помощью Stackru. Хорошо. Но когда _malloca не может выделить память на кучу, это ничего не говорит. Я выделяю большое количество памяти и после этого использую ее, но получаю исключение нарушения доступа. пример
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
void foo(size_t n) {
int *arr = (int*) _malloca(n*sizeof(int));
size_t i;
for (i = 0; i < n; i++) {
arr[i] = rand();
}
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
_freea(arr);
}
void main() {
foo(900000000000);
_getch();
}
НО, когда я использую только часть выделенной памяти, я вообще не получаю никаких исключений. пример
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
void foo(size_t n) {
int *arr = (int*) _malloca(n*sizeof(int));
size_t i;
for (i = 0; i < 100; i++) {
arr[i] = rand();
}
for (i = 0; i < 100; i++) {
printf("%d ", arr[i]);
}
printf("\n");
_freea(arr);
}
void main() {
foo(900000000000);
_getch();
}
VSE2013 WinDesktop. Оки, можно сказать, попробуй поймать исключение
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include <windows.h>
void foo(size_t n) {
int *arr = NULL;
size_t i;
__try {
arr = (int*)_malloca(n*sizeof(int));
} __except (GetExceptionCode() == STATUS_STACK_OVERFLOW) {
int errcode;
printf("_malloca failed!\n");
_getch();
errcode = _resetstkoflw();
if (errcode) {
printf("Could not reset the stack!");
_getch();
_exit(1);
}
}
for (i = 0; i < 100; i++) {
arr[i] = rand();
}
for (i = 0; i < 100; i++) {
printf("%d ", arr[i]);
}
printf("\n");
_freea(arr);
}
void main() {
foo(900000000000);
_getch();
}
но это продолжает работать. А если использовать весь элемент массива, то снова получаешь нарушение доступа.
Вопрос: это баг или фича?
1 ответ
Yey! Я был прав, что _malloca возвращает NULL, когда не может выделить память, используя malloc в куче. Проблема в вызове, что глупо (((
foo(900000000000);
недопустимо, потому что на моем компьютере оно больше размера size_t. malloc.h используйте эту функцию для проверки нормального размера
__inline int _MallocaIsSizeInRange(size_t size)
{
return size + _ALLOCA_S_MARKER_SIZE > size;
}
когда я звоню
foo(INT_MAX);
он возвращает NULL, так как память не может быть выделена.