/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Dos formas conjuntas de liberar la memoria con free

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
cigoba



Registrado: 27 Ago 2007
Mensajes: 43

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com