array realloc

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 de ptr , o NULL si la solicitud falla. Si el size era igual a 0, se devuelve NULL o un puntero adecuado para pasar a free() . Si realloc() falla, el bloque original se deja sin tocar; No se libera ni se mueve.

malloc(3) - Página de manual de Linux


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ón realloc comporta como la función malloc para el tamaño especificado. De lo contrario, si ptr no coincide con un puntero anteriormente devuelto por la función calloc , malloc o realloc , o si el espacio ha sido desasignado por una llamada a la función free o realloc , 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 de ptr , o NULL si la solicitud falla. Si el tamaño era igual a 0, se devuelve NULL o un puntero adecuado para pasar a free() . Si realloc() falla, el bloque original se deja sin tocar; No se libera ni se mueve.