Когда _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, так как память не может быть выделена.

Другие вопросы по тегам