_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 /clr
Restricciones.
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