| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
cigoba

Registrado: 27 Ago 2007 Mensajes: 43
| Publicado: 03/12/2007 4:29 pm | | | Título: Dos formas conjuntas de liberar la memoria con free |
| Hola amigos Investigando por la web acerca de la liberacion de la memoria en arrays y matrices dinamicas en C, encontre este codigo:
| Código: | /* asignación: */ int **matriz; matriz = (int **) calloc(5,sizeof(int *)); for( i=0; i<5; i++ ) matriz[i] = (int *) calloc( 3, sizeof(int));
/* liberación: */ for( i=0; i<5; i++ ) free(matriz[i]); free(matriz);
|
Es realmente imprescindible liberar la memoria utilizando estas dos formas, es decir, primero con un bucle for y free(matriz[i]), y luego solo con free(matriz); o con esta ultima ya es suficiente y segura? La misma pregunta les hago si se tratase de un array (de una sola dimension).
Gracias de antemano _________________ esta es mi firma. |
| | Volver arriba | |  | Karman
Registrado: 15 Oct 2005 Mensajes: 313
| Publicado: 03/12/2007 6:59 pm | | | Título: |
| Cada ves que se almacena memoria el sistema operativo guarda un registro de la dirección asignada y el tamaño, para poder liberarla, cuando llamas a free() con la dirección de la primer celda, el sistema operativo busca si es cierto que esa memoria fue reservada y la libera, es más: (no es necesario que lo pruebes)
int *din; din = (int *) calloc(5,sizeof(int)); din++; free(din);
en esa sentencia free no liberaría la memoria porque la dirección ya no es válida, es por esto que siempre se tiene que tener cuidado de no modificar los punteros a memoria reservada.
Con respecto a tu código, cuando haces la primera reserva de memoria con:
matriz = (int **) calloc(5,sizeof(int *));
estás reservando 5 espacios de sizeof(int *) (4 bits), en la segunda reservas 5 más 5 veces y guardas las direcciones en los primeros 5 espacios reservados, en conclusión reservas 30 espacios de memoria. Con:
for( i=0; i<5; i++ ) free(matriz[i]);
liberas los últimos 25 espacios de memoria reservados, y con:
free(matriz);
los primeros 5. En este caso si no liberaras los primeros 5 no sería mucho problema ya que es poca memoria (aunque no es aconsejable), ya que la idea es liberar toda la memoria solicitada...
S2 _________________ www.inexinferis.co.nr
-. Karman .- |
| | Volver arriba | |  | cigoba

Registrado: 27 Ago 2007 Mensajes: 43
| Publicado: 04/12/2007 7:04 am | | | Título: |
| Gracias Karman por tu aporte. Salu2 _________________ esta es mi firma. |
| | Volver arriba | |  | | rir3760

Registrado: 01 Oct 2004 Mensajes: 3837 Ubicación: Mexico
| Publicado: 04/12/2007 8:00 am | | | Título: |
| En el caso de C las conversiones explicitas no son necesarias, ese fragmento de codigo se puede abreviar a:
| Código: | /* asignación: */ int **matriz;
matriz = calloc(5, sizeof *matriz);
for (i = 0; i < 5; i++) matriz[i] = calloc(3, sizeof *matriz[i]);
/* liberación: */ for (i = 0; i < 5; i++) free(matriz[i]);
free(matriz); |
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |