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

liberar memoria correctamente con free

Estas en el tema de liberar memoria correctamente con free en el foro de C/C++ en Foros del Web. ¡Hola! >_< Tengo una duda que me quita el sueño Si uso esta forma de reserva de memoria: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: Ver original int ...
  #1 (permalink)  
Antiguo 04/08/2016, 16:53
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Pregunta liberar memoria correctamente con free

¡Hola! >_<

Tengo una duda que me quita el sueño

Si uso esta forma de reserva de memoria:
Código C:
Ver original
  1. int linhas = 10;
  2.     int colunas = 10;
  3.     int **matrix = ( int** ) malloc ( sizeof (int) * linhas * colunas );

¿Seria correcto liberarlo de esta forma?:
Código C:
Ver original
  1. free ( matrix );

tengo entendido que malloc ( sizeof (int) * linhas * colunas ) reserva la memoria sin fragmentar. ¿O sea que reservando así, todas las casillas quedan adyacentes, cierto? Luego acontece el cast a 2d o algo así.
El caso es que usando malloc para reservar primero el vector de punteros, y luego un loop para reservar cada uno de los vectores que será apuntado por el vector de punteros reservado previamente, puede pasar que cada vector quede desperdigado donde le parezca a malloc. ¿No es eso? Para que hagan una idea de lo que digo si reservo así:
Código C:
Ver original
  1. int **m = (int**)malloc(sizeof(int)*10);
  2. for(int i = 0; i < 10; i++)
  3. m[i]=(int*)malloc(sizeof(int)*20);
¿En ese caso si que debo usar un loop para liberar correcto? ¿Pero en el caso de usar malloc como dije antes, se puede prescindir de usar el loop para ir liberando cada uno de los vetores apuntados por el vector de punteros y usar free como si de un array se tratara?. No estoy del todo seguro. ¿Alguien me lo confirma o me lo niega?

Esa es mi duda mayor vamos.

¡Gracias y buen finde!
  #2 (permalink)  
Antiguo 05/08/2016, 01:47
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: liberar memoria correctamente con free

malloc sirve para reservar un bloque de memoria de tamaño X. Una vez hecha la reserva te devuelve un puntero al inicio de dicha zona... El como uses esa memoria es irrelevante para él. Cuando tu llamas a free le pasas el puntero al inicio de la memoria a liberar y él se encarga del resto.

Lo anterior quiere decir que cada reserva que hagas debe ser liberada de forma individual. El sistema no sabe que dos regiones van a estar relacionadas e ninguna manera, luego no va a tomar la decisión e hacer liberaciones en cascada... Tu reservas y tu liberas.

En tu ejemplo, para reservar espacio para toda la matriz de una pasada tendrías que hacer:

Código C:
Ver original
  1. int linhas = 10;
  2. int colunas = 10;
  3. int* inmatrix = ( int* ) malloc ( sizeof (int) * linhas * colunas );

La reserva de tu ejemplo original sería útil si necesitas guardar una lista de valores en cada posición de la matriz... Que no creo que sea el caso.

Un saludo
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 05/08/2016, 06:46
 
Fecha de Ingreso: abril-2016
Mensajes: 31
Antigüedad: 8 años, 7 meses
Puntos: 5
Respuesta: liberar memoria correctamente con free

Creo que tendrías que revisar esto:
Cita:
int **matrix = ( int** ) malloc ( sizeof (int) * linhas * colunas );
malloc ( sizeof (int) * linhas * colunas ); va a reservar espacio en memoria para una cantidad (linhas * colunas) de ints, cuando en realidad deberías reservar esa misma cantidad (linhas * colunas) pero para punteros a int.

En una arquitectura donde ints y punteros a ints tienen el mismo tamaño (32 bits cada uno, por ejemplo) no habría diferencia, pero donde sizeof(int) != sizeof(int*) eso no va a andar. Entonces, tendría que ser
Cita:
int** matrix = ( int** ) malloc ( sizeof (int*) * linhas * colunas );
  #4 (permalink)  
Antiguo 05/08/2016, 19:10
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: liberar memoria correctamente con free

Cita:
Creo que tendrías que revisar esto:
malloc ( sizeof (int) * linhas * colunas ); va a reservar espacio en memoria para una cantidad (linhas * colunas) de ints, cuando en realidad deberías reservar esa misma cantidad (linhas * colunas) pero para punteros a int.
Sí... tienes razón. Gracias por recordar.

Etiquetas: correctamente, free, int, liberar, memoria, punteros, usar
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 03:43.