NOMBRE¶
calloc, malloc, free, realloc - Asignar y liberar memoria dinámica
SINOPSIS¶
#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);
void *malloc(size_t size);
void free(void *ptr);
void *realloc(void *ptr, size_t size);
DESCRIPCIÓN¶
calloc() asigna memoria para una matriz de
nmemb elementos de
size bytes cada uno y devuelve un puntero a la memoria asignada. La
memoria es puesta a cero.
malloc() asigna
size bytes y devuelve un puntero a la memoria
asignada. La memoria no es borrada.
free() libera el espacio de memoria apuntado por
ptr, que debe
haber sido devuelto por una llamada previa a
malloc(),
calloc()
o
realloc(). En caso contrario, o si
free(ptr) ya
se ha llamado antes, se produce un comportamiento indefinido. Si
ptr es
NULL, no se realiza ninguna operación.
realloc() cambia el tamaño del bloque de memoria apuntado por
ptr a
size bytes. El contenido permanecerá inalterado hasta
el mínimo entre el tamaño viejo y el nuevo; la memoria recién
asignada quedará sin inicializar. Si
ptr es
NULL, la
llamada es equivalente a
malloc(size); si size es igual a cero, la
llamada es equivalente a
free(ptr). ptr
debe haber sido devuelto por una llamada previa a
malloc(),
calloc() o
realloc(), a menos que
ptr sea
NULL.
VALOR DEVUELTO¶
Para
calloc() y
malloc(), el valor devuelto es un puntero a la
memoria asignada, que está convenientemente alineada para cualquier tipo
de variable, o
NULL si la petición falla.
free() no devuelve ningún valor.
realloc() devuelve un puntero a la memoria recién asignada, que
está convenientemente preparada para cualquier tipo de variable y
podría ser diferente de
ptr, o
NULL si la petición
falla. Si
size es igual a 0, se devuelve o bien NULL o bien un puntero
susceptible de ser pasado a
free().
Si realloc() falla el
bloque original se queda como estaba - no es liberado ni movido.
ANSI-C
VÉASE TAMBIÉN¶
brk(2),
posix_memalign(3)
OBSERVACIONES¶
El estándar Unix98 necesita que
malloc(),
calloc() y
realloc() asignen a
errno el valor ENOMEM en caso de fallo.
Glibc asume que esto se hace (y las versiones de glibc de estas rutinas hacen
esto); si usa una implementación privada de malloc que no asinga un valor
a
errno, entonces ciertas rutinas de biblioteca pueden fallar sin que
en
errno aparezca el motivo del fallo.
Los caídas de
malloc(),
free() o
realloc() casi
siempre están relacionadas con la corrupción de la memoria
montón (heap), tal como el desbordamiento de una porción de memoria
reservada o la liberación del mismo puntero dos veces.
Las versiones recientes de libc de Linux (posteriores a la 5.4.23) y de GNU libc
(2.x) incluyen una implementación de malloc que se puede ajustar mediante
variables de entorno. Cuando se define
MALLOC_CHECK_, se usa una
implementación especial (menos eficiente) que está diseñada
para tolerar errores simples, tales como una llamada doble a
free() con
el mismo argumento o sobrepasar un límite en un byte (fallos "fuera
por poco" o de desbordamiento). No obstante, no es posible protegerse
contra todos los errores y se pueden producir pérdidas de memoria. Si se
asigna a
MALLOC_CHECK_ el valor 0, cualquier corrupción de memoria
montón detectada se ignora silenciosamente; si se le asigna el valor 1,
se imprime un diagnóstico en la salida estándar de error (stderr);
si se le asigna el valor 2, se llama inmediatamente a
abort(). Esto es
útil porque, en caso contrario, se puede producir una caída mucho
más tarde y entonces es mucho más difícil buscar y encontrar la
causa real del problema.
Linux sigue una estrategia de asignación de memoria optimista. Ésto
significa que cuando
malloc() devuelve un valor distinto de NULL no hay
garantía de que la memoria esté realmente disponible. En caso de el
sistema se haya quedado sin memoria, uno o más procesos serán
matados por el infame asesino 00M.