| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
radicaled
Registrado: 07 Nov 2006 Mensajes: 21
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |