como - malloc sizeof
La asignación de memoria falla. Pero ¿por qué se estrella? O lo hace? (2)
Como se ha dicho en los comentarios, no hay un fallo en el fallo de asignación, solo un mensaje de error.
Si el mensaje le molesta, puede desactivarlo redirigiendo el registro de malloc
a /dev/null
, así:
export MallocLogFile=/dev/null
La salida antes de configurar la variable de entorno se ve así:
newstr = prevstr: Same block reused
a.out(4275,0x7fff7146e000) malloc: *** mach_vm_map(size=153288611651584) failed (error code=3)
*** error: can''t allocate region
*** set a breakpoint in malloc_error_break to debug
could not alloc newsize=153288611651277. Sorry
Después de configurar la variable, la salida se ve así:
newstr = prevstr: Same block reused
could not alloc newsize=153288611651277. Sorry
Nota: Esto es altamente específico de Mac. Consulte la documentation para obtener una descripción de otras variables de entorno que modifican los detalles de la operación de malloc
.
Estaba experimentando con realloc
, dándole tamaños cada vez más grandes y comprobando si el mismo bloque se reutilizó o no:
int main ( void )
{
char * newstr, * prevstr = NULL;
size_t newsize, prevsize = 0;
printf ("We play with realloc/n");
while (1) {
newsize = prevsize + 1 + prevsize/3; /* add 33% */
newstr = realloc(prevstr, newsize);
if (newstr == NULL) {
printf ("could not alloc newsize=%zu. Sorry/n", newsize);
break;
} else {
printf ("newsize=%zu successfully alloc''ed/n", newsize);
if (newstr == prevstr) {
printf ("newstr = prevstr:/tSame block reused/n");
} else {
printf ("newstr != prevstr:/tNew block alloc''ed/n");
}
prevstr = newstr; prevsize = newsize;
}
}
return (EXIT_SUCCESS);
}
Como se esperaba, finalmente se llega a un punto en el que el tamaño es demasiado grande y realloc
no puede responder a la solicitud. De acuerdo con el manual, realloc
debería devolver NULL
y establecer errno = ENOMEM
cuando no realloc
éxito.
Esto no es lo que sucede cuando ejecuto el código anterior en mi máquina, una Mac con "Darwin Kernel Version 15.0.0". En lugar de devolver NULL, el código se bloquea y dice
malloc: *** mach_vm_map(size=153288611651584) failed (error code=3)
*** error: can''t allocate region
*** set a breakpoint in malloc_error_break to debug
could not alloc newsize=153288611651277. Sorry
¿Esto es normal? ¿Algo que no entendí al leer la página de manual?
Esto no es crucial para mi código en este momento, pero puedo imaginar situaciones en las que me gustaría probar si la memoria se puede asignar sin correr el riesgo de un bloqueo. ¿Existe una forma estándar de probar si la asignación funcionará sin correr el riesgo de tal caída?
AGREGADO después de resolver el misterio (ver las respuestas a continuación): no hay bloqueo, solo un mensaje de error del sistema de malloc que se interpone en el camino de la salida esperada. Vea a continuación sobre cómo evitar eso.
El código no se bloqueó porque "no se pudo asignar el tamaño de newsize = 153288611651277. Se produjo el error" Lo sentimos ", solo se imprimió un mensaje adicional. @Blagovest Buyukliev
Es probable que el mensaje adicional se envíe en stderr
lugar de en stdout
. @Eugene Sh.