Compartir por


_alloca

Asigna memoria en la pila. Esta función está en desuso, ya que existe una versión más segura; consulte _malloca.

Sintaxis

void *_alloca(
   size_t size
);

Parámetros

size
Bytes que se van a asignar desde la pila.

Valor devuelto

La _alloca rutina devuelve un void puntero al espacio asignado, que está alineado de forma adecuada para el almacenamiento de cualquier tipo de objeto. Si size es 0, _alloca asigna un elemento de longitud cero y devuelve un puntero válido para ese elemento.

Si no se puede asignar el espacio, se genera una excepción de desbordamiento de pila. La excepción de desbordamiento de pila no es una excepción de C++, sino que es una excepción estructurada. En lugar de usar el control de excepciones de C++, debe usar el control de excepciones estructurado (SEH).

Comentarios

_alloca asigna size bytes de la pila de programas. El espacio asignado se libera automáticamente cuando se cierra la función de llamada (no cuando la asignación simplemente pasa fuera del ámbito). Por lo tanto, no pase el valor de puntero devuelto por _alloca como argumento a free.

Existen restricciones para llamar explícitamente a _alloca en un controlador de excepciones. Las rutinas del controlador de excepciones que se ejecutan en procesadores de clase x86 funcionan en su propio marco de memoria: llevan a cabo sus tareas en el espacio de memoria que no se basa en la ubicación actual del puntero de pila de la función de inclusión. Las implementaciones más comunes incluyen expresiones de cláusula catch de C++ y control de excepciones estructurados (SEH) de Windows. Por consiguiente, si se llama explícitamente a _alloca en cualquiera de los siguientes escenarios, se produce un error del programa durante la devolución de la rutina del controlador de excepciones a la que se llama:

  • Expresión de filtro de excepciones de Windows SEH: __except ( _alloca() )

  • Controlador de excepciones finales de Windows SEH: __finally { _alloca() }

  • Expresión de la cláusula catch del controlador de excepciones de C++

Sin embargo, se puede llamar directamente a _alloca desde dentro de una rutina del controlador de excepciones o desde una devolución de llamada proporcionada por la aplicación, invocada mediante uno de los escenarios del controlador de excepciones que se han descrito anteriormente.

Importante

Si _alloca se llama dentro de un bloque try, debe llamar _resetstkoflw a en el bloque catch.

Además de las restricciones anteriores, si se usa la opción /clr (compilación de Common Language Runtime), no se puede usar _alloca en los bloques __except. Para más información, vea /clrRestricciones.

Requisitos

Routine Encabezado necesario
_alloca <malloc.h>

Ejemplo

// 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

Vea también

Asignación de memoria
calloc
malloc
realloc
_resetstkoflw
_malloca