Compartir a través de


_malloca

Asigna memoria en la pila. Esta función es una versión de con mejoras de seguridad, como se describe en Características de _alloca seguridad de CRT.

Sintaxis

void *_malloca(
   size_t size
);

Parámetros

size
Bytes que se van a asignar desde la pila.

Valor devuelto

La _malloca 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, _malloca asigna un elemento de longitud cero y devuelve un puntero válido para ese elemento.

Si size es mayor que _ALLOCA_S_THRESHOLD, _malloca intenta asignarlo al montón y devuelve un puntero nulo si no se puede asignar el espacio. Si size es menor o igual que _ALLOCA_S_THRESHOLD, _malloca intenta asignarlo a la pila y se genera una excepción del desbordamiento de pila si no se puede asignar el espacio. 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) para detectar esta excepción.

Comentarios

_malloca asigna size bytes de la pila del programa o del montón si la solicitud supera un determinado tamaño en bytes proporcionado por _ALLOCA_S_THRESHOLD. La diferencia entre _malloca y _alloca es que _alloca siempre se asigna en la pila, independientemente del tamaño. A diferencia de _alloca, que no requiere ni permite ninguna llamada a free para liberar la memoria así asignada, _malloca requiere el uso de _freea para liberar memoria. En el modo de depuración, _malloca siempre asigna memoria del montón.

Existen restricciones para llamar explícitamente a _malloca 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 habituales incluyen el control de excepciones estructuradas (SEH) de Windows NT y las expresiones de la cláusula catch de C++. Por consiguiente, si se llama explícitamente a _malloca 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 (_malloca () )

  • Controlador final de excepciones de Windows SEH: __finally {_malloca () }

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

Sin embargo, se puede llamar directamente a _malloca 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

En Windows, si _malloca se llama dentro de un try/catch bloque, debe llamar _resetstkoflw a en el bloque catch.

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

Requisitos

Routine Encabezado necesario
_malloca <malloc.h>

Ejemplo: _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();
}

Ejemplo: _malloca excepción

// 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);
        }
    };
}

Entrada

1000

Salida de ejemplo

Enter the number of bytes to allocate using _malloca: 1000

Consulte también

Asignación de memoria
calloc
malloc
realloc
_resetstkoflw