realloc - array - memcpy
¿Realloc libera el búfer anterior si falla? (4)
Si realloc falla y devuelve NULL, ¿el búfer anterior está libre o se mantiene intacto? No encontré esa información en particular en la página de manual y no estoy seguro de qué hacer. Si se libera la memoria, el doble libre podría ser riesgoso. Si no, entonces se produciría la fuga.
realloc()
devuelve un puntero a la memoria recién asignada, que está adecuadamente alineada para cualquier tipo de variable y puede ser diferente deptr
, oNULL
si la solicitud falla. Si elsize
era igual a 0, se devuelveNULL
o un puntero adecuado para pasar afree()
. Sirealloc()
falla, el bloque original se deja sin tocar; No se libera ni se mueve.
No, no lo hace. Ese aspecto me ha molestado a menudo porque no puedes usar simplemente:
if ((buff = realloc (buff, newsize)) == NULL)
return;
en su código si desea liberar el original en caso de fallo. En su lugar tienes que hacer algo como:
if ((newbuff = realloc (buff, newsize)) == NULL) {
free (buff);
return;
}
buff = newbuff;
Por supuesto, entiendo la razón detrás de mantener intacto el búfer original en caso de fallo, pero mi caso de uso ha surgido lo suficiente como para codificar mis propias funciones para manejar ese caso, algo como:
// Attempt re-allocation. If fail, free old buffer, return NULL.
static void *reallocFreeOnFail (void *oldbuff, size_t sz) {
void *newbuff = realloc (oldbuff, sz);
if (newbuff == NULL) free (oldbuff);
return newbuff;
}
// Attempt re-allocation. If fail, return original buffer.
// Variable ok is set true/false based on success of re-allocation.
static void *reallocLeaveOnFail (void *oldbuff, size_t sz, int *ok) {
void *newbuff = realloc (oldbuff, sz);
if (newbuff == NULL) {
*ok = 0;
return oldbuff;
}
*ok = 1;
return newbuff;
}
La sección relevante en los estados estándar de C11 (mis cursivas):
7.20.3.4 La función
realloc
Si
ptr
es un puntero nulo, la funciónrealloc
comporta como la funciónmalloc
para el tamaño especificado. De lo contrario, siptr
no coincide con un puntero anteriormente devuelto por la funcióncalloc
,malloc
orealloc
, o si el espacio ha sido desasignado por una llamada a la funciónfree
orealloc
, el comportamiento no está definido. Si la memoria para el nuevo objeto no se puede asignar, el objeto anterior no se desasigna y su valor no se modifica.
No. No lo hará. Los cambios de realloc aumentan / disminuyen la memoria dinámica asignada a través de malloc o calloc. Devolverá NULL en caso de que realloc falle al aumentar la memoria pero no cambiará la memoria asignada previamente. Como Realloc calcula la nueva asignación de memoria desde la dirección base de la memoria asignada anteriormente, no realiza ninguna operación en la memoria
No. No se realiza ningún cambio en el búfer anterior si realloc()
.
hombre
realloc(3)
:
realloc()
devuelve un puntero a la memoria recién asignada, que está adecuadamente alineada para cualquier tipo de variable y puede ser diferente deptr
, oNULL
si la solicitud falla. Si el tamaño era igual a 0, se devuelveNULL
o un puntero adecuado para pasar afree()
. Sirealloc()
falla, el bloque original se deja sin tocar; No se libera ni se mueve.