/
Inicio :: Foros

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

Uso del fflush - problema de memoria?

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
radicaled



Registrado: 07 Nov 2006
Mensajes: 21

MensajePublicado: 14/11/2007 11:29 am
Título: Uso del fflush - problema de memoria?

Gente, les explico mi problema, estoy manejando strings como char *
el caso es que tengo una funcion recursiva de insercion en un arbol que llama al string++, el problema es que lo tengo que hacer 86000 veces, 4 o 5 veces se lo banca bien. Pero cuando agrego mas elementos se muere. Estoy dudando si es que no queda informacion en memoria.

Les paso el codigo a ver si alguien ve una asignacion o una recursividad de mas. La otra pregunta es como hago para liberar lo usado en memoria, con el fflush???

Disculpen la longitud y la repeticion de codigo, pero queria ver que funcione.

Gracias, Saludos

Código:

void Insertar(Arbol *lista, char *numero, int posicion) {
   pNodo nuevo, anterior;
   char letra[10];
   int trad;
   
   fflush(stdout);
   printf ("el resto del numero %s\n", numero);
   strncpy(letra, numero, 1);
   trad = atoi(letra);
   nuevo = (pNodo)malloc(sizeof(tipoNodo));
   nuevo->numero = trad;

   //Si es el ultimo valor de la palabra inserto la posicion
   if (strlen(numero)== 1){
      //inserto posicion
      InsertoInterna(&nuevo->listaInterna, posicion);
   }
   //La lista esta vacia, inserto en el principio
   if (ListaVacia(*lista)){
      nuevo->siguiente = *lista;
      *lista = nuevo;
     if (strlen(numero)>1){
         if ((int)numero[0]>=(int)numero[1]){
            //Inserto a Insquierda
            Insertar(&nuevo->izquierda, ++numero, posicion);
         }
         else{
            //Inserto derecha
            Insertar(&nuevo->derecha, ++numero, posicion);
         }
      }
   }else{
        anterior = *lista;
     
        while ((anterior->siguiente) && (anterior->numero != trad))
              anterior = anterior->siguiente;
      
      /*Si yo se que el nodo anterior tiene el mismo numero entonces incerto en el nodo anterior a izquierda y derecha y me olvido del nuevo, si no existe, entonces inserto el nuevo,
      y le digo al nuevo inserta a derecha e izquierda*/
      if (anterior->numero == trad){
         if (strlen(numero)>1){
            if ((int)numero[0]>=(int)numero[1])
               //Inserto a Insquierda
               Insertar(&anterior->izquierda, ++numero, posicion);
            else
               //Inserto derecha
               Insertar(&anterior->derecha, ++numero, posicion);
         }
         free(nuevo);
      }
      else{
         nuevo->siguiente = anterior->siguiente;
         anterior->siguiente = nuevo;
         if (strlen(numero)>1){
            if ((int)numero[0]>=(int)numero[1])
               //Inserto a Insquierda
               Insertar(&nuevo->izquierda, ++numero, posicion);
            else
               //Inserto derecha
               Insertar(&nuevo->derecha, ++numero, posicion);
         }
      }
   }

   return;
}
Volver arriba
mamntc02



Registrado: 30 Abr 2007
Mensajes: 266

MensajePublicado: 15/11/2007 4:37 am
Título:

Hola,

Qué quieres decir exactamente con:
Cita:
como hago para liberar lo usado en memoria, con el fflush???

Para liberar memoria sólo puedes usar free (o delete si la reservas con new). fflush sólo vacia el buffer intermedio de salida hacia el dispositivo al q apunte (Un fichero, DB, pantalla, etc...)

Otra cosa. Esta instrucción no es demasiado correcta y puede producir errores:
Código:
if ((int)numero[0]>=(int)numero[1]){...}

Ten en cuenta q un int tiene 32bits (en una màquina con ese tamaño de palabra) y tu estás intentando comparar dos valores q tienen un tamaño de 8bits, pasado a 32bits y podría pasar q lo hiciera mal.

Respecto a la memoria puedes usar el 'task manager' (de Windows) para ver si la memoria te augmenta demasiado.
Puedes también buscar memory leaks por tu código. Una manera es sobreescribir los métodos malloc y free, para q tengan control sobre la memoria. Otra, y más fácil, es usar (en el caso de usar Visual C++) funciones de control para debugar, como _CrtDumpMemoryLeaks
Échale un vistazo a http://msdn2.microsoft.com/en-us/library/d41t22sb(VS.80).aspx donde te indican como funciona y algún ejemplo de uso.

Saludos.
Volver arriba
radicaled



Registrado: 07 Nov 2006
Mensajes: 21

MensajePublicado: 15/11/2007 6:09 am
Título:

Muchas gracias por la respuesta, yo suponia que el fflush liberaba la memoria del buffer.

Por otro lado, estuve haciendo un pequeño debug (si es que se puede decir), para ver donde se colgaba el programa y encontre que fue en la linea del strlen
Código:
if strlen(numero)== 1){

No creo haber hecho algo mal para que me diera error ahi.
No se si la comparacion puede dar problemas.
Código:
if ((int)numero[0]>=(int)numero[1]){


O hay otraforma para hacer la comparacion en un string de 2 numeros seguidos. Por ejemplo "123456" quiero ver si el 1 es mayor al 2

Gracias
Volver arriba
radicaled



Registrado: 07 Nov 2006
Mensajes: 21

MensajePublicado: 15/11/2007 8:09 am
Título:

Finalmente me di cuenta donde esta el problema. El caso es que estoy programando en MAC y el programa levanta hasta 8mb en memoria y al parecer toca la memoria del sistema, por eso se muere.
Igualmente creo que tiene un leak el programa.

Saludos
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
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