Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Выделение памяти в стеке. Эта функция устарела, так как доступна более безопасная версия; см. раздел _malloca.
Синтаксис
void *_alloca(
size_t size
);
Параметры
size
Байты, которые нужно выделить из стека.
Возвращаемое значение
Подпрограмма _alloca возвращает void указатель на выделенное пространство, которое подходит для хранения любого типа объекта. Если значение size равно 0, _alloca выделяет элемент нулевой длины и возвращает допустимый указатель на этот элемент.
Исключение переполнения стека создается, если пространство не может быть выделено. Исключение переполнения стека не является исключением C++; Это структурированное исключение. Вместо обработки исключений C++ необходимо использовать структурированную обработку исключений (SEH).
Замечания
_alloca
size выделяет байты из стека программы. Выделенное пространство автоматически освобождается при выходе вызывающей функции (а не при простом выходе выделения из области). Поэтому не передайте значение указателя, возвращаемое _alloca в качестве аргумента free.
Существуют ограничения на явный вызов _alloca в обработчике исключений (EH). Подпрограммы EH, работающие на процессорах класса x86, работают в собственном кадре памяти: они выполняют свои задачи в пространстве памяти, которое не зависит от текущего расположения указателя стека включающей функции. Наиболее распространенные реализации включают структурированную обработку исключений Windows (SEH) и выражения предложения catch C++ . Поэтому явный вызов _alloca в любом из следующих сценариев приводит к сбою программы во время возврата к вызывающей подпрограмме EH:
Выражение фильтра исключений SEH для Windows:
__except ( _alloca() )Обработчик окончательных исключений Windows SEH:
__finally { _alloca() }Выражение catch обработки исключений языка C++
Однако _alloca можно вызывать непосредственно из подпрограммы обработки исключений или предоставленного приложением обратного вызова, который вызывается одним из перечисленных выше сценариев обработки исключений.
Внимание
Если _alloca вызывается внутри блока try, необходимо вызвать _resetstkoflw в блоке catch.
Помимо указанных выше ограничений при использовании /clr параметра (компиляция среды CLR) нельзя использовать в __except блоках. _alloca Дополнительные сведения см. в разделе /clr "Ограничения".
Требования
| Маршрут | Обязательный заголовок |
|---|---|
_alloca |
<malloc.h> |
Пример
// crt_alloca.c
// This program demonstrates the use of
// _alloca and trapping any exceptions
// that may occur.
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
int main()
{
int size = 1000;
int errcode = 0;
void *pData = NULL;
// Note: Do not use try/catch for _alloca,
// use __try/__except, since _alloca throws
// Structured Exceptions, not C++ exceptions.
__try {
// An unbounded _alloca can easily result in a
// stack overflow.
// Checking for a size < 1024 bytes is recommended.
if (size > 0 && size < 1024)
{
pData = _alloca( size );
printf_s( "Allocated %d bytes of stack at 0x%p",
size, pData);
}
else
{
printf_s("Tried to allocate too many bytes.\n");
}
}
// If an exception occurred with the _alloca function
__except( GetExceptionCode() == STATUS_STACK_OVERFLOW )
{
printf_s("_alloca failed!\n");
// If the stack overflows, use this function to restore.
errcode = _resetstkoflw();
if (errcode == 0) // _resetstkoflw() returns 0 on failure
{
printf_s("Could not reset the stack!\n");
_exit(1);
}
};
}
Allocated 1000 bytes of stack at 0x0012FB50
См. также
Распределение памяти
calloc
malloc
realloc
_resetstkoflw
_malloca