2011-03-24 23 views
15

Al usar realloc, ¿la memoria se libera automáticamente? ¿O es necesario usar gratis con realloc? ¿Cual de los siguientes es correcto?C - Si se usa Realloc, ¿es necesario?

//Situation A 
ptr1 = realloc(ptr1, 3 * sizeof(int)); 

//Situation B 
ptr1 = realloc(ptr2, 3 * sizeof(int)); 
free(ptr1); 
ptr1 = ptr2; 

Respuesta

41

Ninguno es correcto. realloc() puede devolver un puntero a la memoria recién asignada o NULL en caso de error. Lo que debe hacer es comprobar el valor de retorno:

ptr1 = realloc(ptr2, 3 * sizeof(int)); 
if (!ptr1) { 
    /* Do something here to handle the failure */ 
    /* ptr2 is still pointing to allocated memory, so you may need to free(ptr2) here */ 
} 

/* Success! ptr1 is now pointing to allocated memory and ptr2 was deallocated already */ 
free(ptr1); 
9

Después de ptr1 = realloc(ptr2, 3 * sizeof(int)); ptr2 no es válido y no debe ser usado. Solo debe liberar ptr1. En algunos casos el valor de retorno de realloc será el mismo valor que aprobó.

Se puede considerar segura ptr1=realloc(ptr2, ... como equivalente a esto:

ptr1 = malloc(...); 
memcpy(ptr1, ptr2, ...); 
free(ptr2); 

Esto es lo que ocurre en la mayoría de los casos, a menos que el nuevo tamaño todavía cabe en el bloque de memoria de edad - a continuación, realloc podría devolver el bloque de memoria original.

Al igual que otras funciones de asignación, realloc devuelve NULL si falla, es posible que desee comprobarlo.

+3

"ptr2 es válido y no se debe utilizar" - a no ser que se devuelve un puntero nulo, en cuyo caso ptr2 sigue siendo válido y todavía necesita liberar con el tiempo. Entonces, en el código equivalente, las líneas segunda y tercera son solo 'if (ptr1)'. –

4

realloc() libera automáticamente la memoria original, o lo devuelve sin cambios (aparte de metadatos) si realloc() a un tamaño más pequeño o no hay memoria disponible sin asignar simplemente ampliar la asignación original en su lugar.

1

De acuerdo con http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/, realloc devuelve el nuevo bloque de memoria si la reasignación es exitosa, mantiene el bloque de memoria original si no es así. El uso estándar se vería así:

ptr2 = realloc(ptr1, new_size); 
if (ptr2 == NULL) { 
    //ptr1 still contains pointer to original array 
} else { 
    //ptr2 contains new array, ptr1 is invalid 
} 
+0

La descripción que proporciona no está de acuerdo con el comportamiento que exige el estándar: 'realloc' devuelve NULL cuando falla. – pmg

+0

Traté de solucionarlo con la edición, no quería borrar lo que estaba escrito. ¿Sabes cómo tachar el texto no deseado aquí? –

+1

simplemente elimine el error. El objetivo de la edición es mejorar la respuesta. Si alguien piensa que el comentario de PMG parece fuera de lugar a la luz de la respuesta tal como lo ven, pueden consultar el historial de revisión. –

0

En ambas situaciones, debe liberarse ptr1.

La situación B es más compleja porque ptr2 potencialmente apunta al espacio liberado. O no. Depende de si se puede reasignar. ptr2 no se debe utilizar después del realloc en B.

Cuestiones relacionadas