c memory realloc

¿Cuál es el uso correcto de realloc() cuando falla y devuelve NULL?



memory (4)

¿Puede alguien resumir cuál es el uso correcto de realloc() ?

¿Qué haces cuando falla realloc() ?

Por lo que he visto hasta ahora, parece que si realloc() falla, tienes que free() puntero antiguo. ¿Es eso cierto?

Aquí hay un ejemplo:

1. char *ptr = malloc(sizeof(*ptr) * 50); 2. ... 3. char *new_ptr = realloc(ptr, sizeof(*new_ptr) * 60); 4. if (!new_ptr) { 5. free(ptr); 6. return NULL; 7. }

Supongamos que realloc() falla en la línea 3 . ¿Estoy haciendo lo correcto en la línea 5 por free() ing ptr ?


De http://www.c-faq.com/malloc/realloc.html

Si realloc no puede encontrar suficiente espacio, devuelve un puntero nulo y deja la región anterior asignada.

Por lo tanto, de hecho, necesitarías liberar la memoria asignada previamente.


Depende de lo que quieras hacer. Cuando falla realloc , ¿qué es lo que quieres hacer: liberar el bloque anterior o mantenerlo vivo y sin cambios? Si quieres liberarlo, entonces libéralo.

También tenga en cuenta que en C89 / 90 si realiza una solicitud de realloc con un tamaño de destino cero, la función realloc puede devolver un puntero nulo aunque la memoria original se haya desasignado con éxito. Esto fue un defecto en C89 / 90, ya que no había manera de determinar el éxito del fracaso en el retorno nulo.

En C99, este defecto se solucionó y se garantizó la relación estricta entre el retorno nulo y el éxito / fracaso de la reasignación. En C99, el retorno nulo siempre significa una falla total de realloc .


Edit: Corrección, algunas personas me están criticando por lo que dije, la forma en que asignaste tu puntero parece ser la mejor práctica entre ellos, me enseñaron a usar siempre moldes de tipo en el sizeof() , pero aparentemente tu manera es más correcta , así que ignora lo que dije =)

Echar un vistazo a http://en.wikipedia.org/wiki/Malloc#realloc antes podría haberte servido de algo.

No entiendes completamente sizeof() , tiene el valor del tamaño del argumento que le pasas en bytes. Por ejemplo, sizeof(int) será 4 en la mayoría de los sistemas de 32 bits, pero aún así debería usar sizeof(int) lugar de 4 porque compilar su código en un sistema de 64 bits (solo como ejemplo) hará que ese valor sea igual a 8 y su código todavía se compilará bien. ¿Para qué estás asignando memoria? Punteros Si es así, debe usar sizeof(void*) lugar (puede decir sizeof(int*) pero es una convención común no mencionar al compilador lo que desea almacenar en esos punteros, ya que todos los punteros deben ser del mismo tamaño, por lo que la mayoría los programadores dicen que sizeof(void*) ), si necesita espacio para los caracteres, use sizeof(char) y así sucesivamente.

Sin embargo, tiene razón al almacenar el valor de retorno de realloc() en un nuevo puntero y verificarlo, aunque muchos programadores asumirán que el sistema siempre tiene suficiente memoria y se saldrá con la suya.


Si falla realloc, no creo que desee eliminar el bloque original, ya que lo perderá. Parece que realloc cambiará el tamaño del bloque anterior (o devolverá un puntero a una nueva ubicación) y, en caso de éxito, devolverá un puntero al bloque antiguo (o nueva ubicación) y si falla, devolverá NULL. Si no puede asignar un nuevo bloque, el bloque anterior no se modifica.