_malloca_malloca

Выделение памяти в стеке.Allocates memory on the stack. Это версия функции _alloca с усовершенствованиями системы безопасности, описанными в разделе Функции безопасности в CRT.This is a version of _alloca with security enhancements as described in Security Features in the CRT.

СинтаксисSyntax

void *_malloca(
   size_t size
);

ПараметрыParameters

sizesize
Байты, которые нужно выделить из стека.Bytes to be allocated from the stack.

Возвращаемое значениеReturn Value

_Malloca подпрограммы возвращает void указатель на выделенное пространство, которое гарантированно согласуется для хранения любого типа объекта.The _malloca routine returns a void pointer to the allocated space, which is guaranteed to be suitably aligned for storage of any type of object. Если Размер равен 0, _malloca выделяет элемент нулевой длины и возвращает допустимый указатель на этот элемент.If size is 0, _malloca allocates a zero-length item and returns a valid pointer to that item.

Если Размер больше _ALLOCA_S_THRESHOLD, _malloca пытается выделить память в куче и возвращает пустой указатель, если пространство невозможно выделить.If size is greater than _ALLOCA_S_THRESHOLD, then _malloca attempts to allocate on the heap, and returns a null pointer if the space can't be allocated. Если Размер меньше или равен _ALLOCA_S_THRESHOLD, _malloca пытается выделить значение в стеке, и создается исключение переполнения стека, если не удается выделить пространство.If size is less than or equal to _ALLOCA_S_THRESHOLD, then _malloca attempts to allocate on the stack, and a stack overflow exception is generated if the space can't be allocated. Исключение переполнения стека не является исключением C++; это структурированное исключение.The stack overflow exception isn't a C++ exception; it's a structured exception. Вместо использования обработки исключений C++ необходимо использовать структурированную обработку исключений (SEH) для перехвата этого исключения.Instead of using C++ exception handling, you must use Structured Exception Handling (SEH) to catch this exception.

КомментарииRemarks

_malloca выделяет байты размера из стека программы или кучи, если запрос превышает определенный размер в байтах, заданный в _ALLOCA_S_THRESHOLD._malloca allocates size bytes from the program stack or the heap if the request exceeds a certain size in bytes given by _ALLOCA_S_THRESHOLD. Различие между _malloca и _alloca заключается в том, что _alloca всегда выделяется в стеке независимо от размера.The difference between _malloca and _alloca is that _alloca always allocates on the stack, regardless of the size. В отличие от _alloca, в которых не требуется или не разрешен вызов для освобождения памяти, чтобы освободить память, _malloca требует использования _freea для освобождения памяти.Unlike _alloca, which does not require or permit a call to free to free the memory so allocated, _malloca requires the use of _freea to free memory. В режиме отладки _malloca всегда выделяет память из кучи.In debug mode, _malloca always allocates memory from the heap.

Существуют ограничения на явный вызов _malloca в обработчике исключений (EH).There are restrictions to explicitly calling _malloca in an exception handler (EH). Подпрограммы обработки исключений, выполняющиеся на процессорах класса x86, работают в своем собственном кадре памяти: они выполняют задачи в области памяти, не основанной на текущем положении указателя стека внешней функции.EH routines that run on x86-class processors operate in their own memory frame: They perform their tasks in memory space that is not based on the current location of the stack pointer of the enclosing function. Наиболее распространенные реализации включают выражения структурной обработки исключений (SEH) Windows NT и выражения catch языка C++.The most common implementations include Windows NT structured exception handling (SEH) and C++ catch clause expressions. Таким образом, явный вызов _malloca в любом из следующих сценариев приводит к сбою программы во время возврата в вызывающую подпрограмму EH:Therefore, explicitly calling _malloca in any of the following scenarios results in program failure during the return to the calling EH routine:

  • Выражение фильтра исключений SEH Windows NT: __except ( _malloca () )Windows NT SEH exception filter expression: __except (_malloca () )

  • Завершающий обработчик исключений Windows NT SEH: __finally { _malloca () }Windows NT SEH final exception handler: __finally {_malloca () }

  • Выражение catch обработки исключений языка C++C++ EH catch clause expression

Однако _malloca можно вызывать непосредственно из подпрограммы EH или из предоставленного приложением обратного вызова, который вызывается одним из сценариев EH, приведенных выше.However, _malloca can be called directly from within an EH routine or from an application-supplied callback that gets invoked by one of the EH scenarios previously listed.

Важно!

В Windows XP, если _malloca вызывается внутри блока try/catch, необходимо вызвать _resetstkoflw в блоке catch.In Windows XP, if _malloca is called inside a try/catch block, you must call _resetstkoflw in the catch block.

В дополнение к указанным выше ограничениям при использовании параметра /CLR (компиляция среды CLR) _malloca нельзя использовать в __except блоках.In addition to the above restrictions, when using the /clr (Common Language Runtime Compilation) option, _malloca cannot be used in __except blocks. Для получения дополнительной информации см. /clr Restrictions.For more information, see /clr Restrictions.

ТребованияRequirements

ПодпрограммаRoutine Обязательный заголовокRequired header
_malloca_malloca <malloc.h>

Пример: mallocExample: malloca

// crt_malloca_simple.c
#include <stdio.h>
#include <malloc.h>

void Fn()
{
   char * buf = (char *)_malloca( 100 );
   // do something with buf
   _freea( buf );
}

int main()
{
   Fn();
}

Пример: исключение mallocExample: malloca exception

// crt_malloca_exception.c
// This program demonstrates the use of
// _malloca and trapping any exceptions
// that may occur.

#include <windows.h>
#include <stdio.h>
#include <malloc.h>

int main()
{
    int     size;
    int     numberRead = 0;
    int     errcode = 0;
    void    *p = NULL;
    void    *pMarker = NULL;

    while (numberRead == 0)
    {
        printf_s("Enter the number of bytes to allocate "
                 "using _malloca: ");
        numberRead = scanf_s("%d", &size);
    }

    // Do not use try/catch for _malloca,
    // use __try/__except, since _malloca throws
    // Structured Exceptions, not C++ exceptions.

    __try
    {
        if (size > 0)
        {
            p =  _malloca( size );
        }
        else
        {
            printf_s("Size must be a positive number.");
        }
        _freea( p );
    }

    // Catch any exceptions that may occur.
    __except( GetExceptionCode() == STATUS_STACK_OVERFLOW )
    {
        printf_s("_malloca failed!\n");

        // If the stack overflows, use this function to restore.
        errcode = _resetstkoflw();
        if (errcode)
        {
            printf("Could not reset the stack!");
            _exit(1);
        }
    };
}

Входные данныеInput

1000

Пример выходных данныхSample Output

Enter the number of bytes to allocate using _malloca: 1000

См. также разделSee also

Выделение памятиMemory Allocation
calloccalloc
mallocmalloc
reallocrealloc
_resetstkoflw_resetstkoflw