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

Duda en C/C++

Estas en el tema de Duda en C/C++ en el foro de C/C++ en Foros del Web. Hola compañeros, Mi problema es que tengo este código: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original vector * sub ( vector * v1 , vector * ...
  #1 (permalink)  
Antiguo 31/10/2014, 09:44
 
Fecha de Ingreso: octubre-2014
Ubicación: Cornellá de Llobregat
Mensajes: 8
Antigüedad: 10 años
Puntos: 2
Duda en C/C++

Hola compañeros,

Mi problema es que tengo este código:

Código C++:
Ver original
  1. vector* sub( vector* v1, vector* v2 ) {
  2.         int i;
  3.         if ( v1->dim != v2->dim ) {             //si tienen tamaño distinto
  4.                 if ( v1->dim > v2->dim ) {              //si v1 > v2
  5.                         vector* res = (vector*)malloc(sizeof( vector));
  6.                         res->data = (float*)malloc(sizeof( float)*v1->dim);
  7.                         res->dim = v1->dim;
  8.                         for ( i = 0; i < v2->dim; i++)
  9.                             res->data[i] = v1->data[i] - v2->data[i];       //restamos hasta dim del pequeño
  10.                         for ( i = i; i < v1->dim; i++)
  11.                             res->data[i] = v1->data[i];                     //sumamos lo que falta
  12.             return res;
  13.  
  14.                 }
  15.                 else {                          //si v2 > v1
  16.                         vector* res = (vector*) malloc(sizeof( vector));
  17.                         res->data = (float*) malloc(sizeof( float)*v2->dim);
  18.                         res->dim = v2->dim;
  19.                         for ( i = 0; i < v1->dim; i++)
  20.                             res->data[i] = v1->data[i] - v2->data[i];           //restamos hasta dim del peuqeño
  21.                         for ( i = i; i < v2->dim; i++)
  22.                             res->data[i] = 0.0 - v2->data[i];               //restamos lo que falta añadiendo 0
  23.             return res;
  24.  
  25.                 }
  26.         }
  27.         else {                                  //si v1 = v2
  28.                 vector* res = (vector*) malloc(sizeof( vector));
  29.                 res->data = (float*) malloc(sizeof( float)*v1->dim);
  30.                 res->dim = v1->dim;
  31.                 for (i = 0; i < v1->dim; i++ )
  32.                     res->data[i] = v1->data[i] - v2->data[i];
  33.                 return res;
  34.                 free(v1);
  35.                 free(v2);
  36.  
  37.         }
  38. }
Lo que hace es hacer una resta de dos vectores.

El problema que tengo es que he pasado Valgrind para ver si había fugas de memoria y me ha dicho que tengo en esta función, posiblemente en un malloc, lo que pasa es que no consigo ver donde tengo la fuga de memoria.

Valgrind me devuelve esto:

Cita:
==2722== 252 (144 direct, 108 indirect) bytes in 9 blocks are definitely lost in loss record 2 of 2
==2722== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2722== by 0x4011C7: sub(vector*, vector*) (in /home/yeray/Escritorio/164324_164376/p1)
==2722== by 0x40155E: distance(vector*, vector*) (in /home/yeray/Escritorio/164324_164376/p1)
==2722== by 0x401BCB: determinar_operacion(char*, vector**) (in /home/yeray/Escritorio/164324_164376/p1)
==2722== by 0x401DB0: main (in /home/yeray/Escritorio/164324_164376/p1)
Solo me preocupa la función sub de mi código ya que todos los errores que salen además del de la función SUB es porque esta misma función está incluida en las otras.

Os escribo para saber si vosotros me podíais ayudar compañeros.

Muchas gracias :)

Última edición por yeraypg; 31/10/2014 a las 10:38
  #2 (permalink)  
Antiguo 31/10/2014, 13:11
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Duda en C/C++

Por un lado tienes esto:

Código C++:
Ver original
  1. return res;
  2.   free(v1);
  3.   free(v2);

Todo lo que hay después del return no se va a ejecutar.

Pero vamos, que no creo que tu problema sea ese.

A ver, lo lógico sería que esa función únicamente cree un nuevo vector a partir de otros dos ya existentes, luego esta función no debería liberar memoria. Eso implica borrar los dos free que tienes que, además no se ejecutan, luego mejor quitarlos.

Lo que sucede es que tienes que encargarte de liberar la memoria reservada por los vectores cuando ya no los necesites.

Un ejemplo de laguna de memoria:

Código C++:
Ver original
  1. char* NewArray( int length )
  2. {
  3.   char* to_return = calloc( length, sizeof( char ) );
  4.   return to_return;
  5. }
  6.  
  7. int main( )
  8. {
  9.   char* array = NewArray( 5 ); // OK
  10.   array = NewArray( 10 ); // Laguna de memoria, se pierde el puntero al primer array.
  11.  
  12.   free( array ); // Liberamos el array de 10, pero el de 5 sigue vivo. Perdido pero vivo.
  13. }

Para darte más detalles sobre las lagunas de memoria es conveniente conocer todo el código... básicamente porque Valgrind te dice dónde se han hecho las reservas que están generando lagunas, pero no puede identificar dónde debería liberarse esta memoria (y es ahí donde tienes que actuar).

Un saludo.
  #3 (permalink)  
Antiguo 31/10/2014, 14:27
 
Fecha de Ingreso: octubre-2014
Ubicación: Cornellá de Llobregat
Mensajes: 8
Antigüedad: 10 años
Puntos: 2
Respuesta: Duda en C/C++

Aquí teneis el pastebin del main: [URL="http://pastebin.com/ajsuZjKq"]http://pastebin.com/ajsuZjKq[/URL]

Aqy¡uí el del source: [URL="http://pastebin.com/TFWCt8ah"]http://pastebin.com/TFWCt8ah[/URL]

Muchas gracias :)

Etiquetas: memory
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 20:09.