Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Liberar array reservado con malloc

Estas en el tema de Liberar array reservado con malloc en el foro de C/C++ en Foros del Web. Hola a todos, tengo un programa que crea un vector de registros: Código: typedef struct fecha { int dia; int mes; int anio; } tipoFecha; ...
  #1 (permalink)  
Antiguo 03/06/2015, 11:20
 
Fecha de Ingreso: mayo-2015
Mensajes: 19
Antigüedad: 9 años, 6 meses
Puntos: 0
Exclamación Liberar array reservado con malloc

Hola a todos, tengo un programa que crea un vector de registros:

Código:
typedef struct fecha {
    int dia;
    int mes;
    int anio;
} tipoFecha;

typedef struct empleados {
    char nombre[15];
    tipoFecha fechaNacimiento;
} tipoEmpleado;
Creo el vector pidiendo al usuario cuantos registros de empleados quiere crear (numEmpleados) y reservo la memoria:

Código:
    tipoEmpleado *registros;
//Pido numEmpleados
    registros = (tipoEmpleado *)malloc(numRegistros*sizeof(tipoEmpleado));
El problema lo tengo al pasar los registros a una función para operar con ellos, y luego deseo liberarlos dentro de esa función:
Código:
//llamada a función:
funcion(registros, numRegistros);
Código:
funcion(tipoEmpleado *regEmp, int nEmpleados,) {

...

//Libero array
    for (i=0; i<nEmpleados; i++) {
        free(&regEmp[i]);
    }
    free(regEmp);
    regEmp = NULL;

}
Pero me da un error, y haciendo solo free(regEmp) no se libera...
Como debo liberar correctamente el array de registros?
  #2 (permalink)  
Antiguo 03/06/2015, 14:00
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Liberar array reservado con malloc

Código C:
Ver original
  1. for (i=0; i<nEmpleados; i++) {
  2.         free(&regEmp[i]);
  3.     }

El bucle anterior sobra. Cuando hiciste la reserva de memoria, únicamente usaste un malloc, luego el bloque de memoria se ha de liberar únicamente con un free.

Por otro lado, "free(regEmp)" SI que libera la memoria. Liberar la memoria únicamente sirve para decirle al Sistema Operativo que esa región de memoria puede ser utilizada por quien la pida... liberar la memoria no implica sobreescribir lo que ya está almacenado en la misma. Lo que sucede es que la siguiente instrucción "regEmp = NULL;" implica únicamente un cambio local, por lo que el puntero registro no se entera.

Dicho de otra forma: regEmp es un puntero, sí, pero también es una variable local de funcion. Todos los cambios que realices en la memoria apuntada se verán reflejados fuera de la función... pero si haces que regEmp apunte a otra región de memoria, entonces ese cambio es local.

Si quieres que registro acabe apuntando a NULL necesitas usar un puntero doble tal que:

Código C:
Ver original
  1. funcion(&registros, numRegistros);
  2.  
  3. // Nota que nEmpleados no es necesaria en la función
  4. funcion(tipoEmpleado **regEmp, int nEmpleados) {
  5.     //Libero array
  6.     free(&regEmp);
  7.     *regEmp = NULL;
  8. }

Un saludo
  #3 (permalink)  
Antiguo 03/06/2015, 14:40
 
Fecha de Ingreso: mayo-2015
Mensajes: 19
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Liberar array reservado con malloc

De acuerdo, entonces con free(regEmp) libero la posición en memoria del array de registros de empleados, pero éste sigue existiendo no? Porque para comprobarlo después de liberar la memoria, intente imprimir de nuevo los registros de empleados y seguir apareciendo. Es normal?

Era un ejercicio de examen que me pedía liberar los registros con función. Está bien resuelto?
  #4 (permalink)  
Antiguo 03/06/2015, 15:18
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Liberar array reservado con malloc

Cita:
Iniciado por albondi Ver Mensaje
De acuerdo, entonces con free(regEmp) libero la posición en memoria del array de registros de empleados, pero éste sigue existiendo no? Porque para comprobarlo después de liberar la memoria, intente imprimir de nuevo los registros de empleados y seguir apareciendo. Es normal?
Como te he comentado, free únicamente marca esa memoria como disponible. Los datos ahí almacenados seguirán existiendo hasta que esa memoria vuelva a ser reservada, momento a partir del cual esos datos pueden acabar sobreescritos en cualquier momento. En cualquier caso no es para nada seguro acceder a memoria liberada, así que asegúrate de liberar la memoria una vez que sepas que ya no necesitas lo que ahí está almacenado.

Cita:
Iniciado por albondi Ver Mensaje
Era un ejercicio de examen que me pedía liberar los registros con función. Está bien resuelto?
Si haces X=malloc(), entonces has de hacer free(X). Esto implica que free se ha de ejecutar exactamente el mismo número de veces que malloc.

Mientras cumplas con estas premisas el ejercicio estará correctamente resuelto.

Un saludo

Etiquetas: char, funcion, int, liberar, malloc, programa, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:38.