Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Los Misterios Insondables De Las Allocations Non Freed
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Los Misterios Insondables De Las Allocations Non Freed 
 
Tengo hecha una clase que hereda de Tableview (o de Gridview, que con los dos he probado) y que extiende un poquito las funcionalidades (ordenar cuando se hace click en el título y cosas así). Pues bien, me lleva loco desde hace meses porque cada vez que la uso, al cerrar la aplicación se genera el famoso error en consola de "Warning: Mogollón de allocations non freed".

Como se supone que eso son variables que no se pueden destruir de memoria, he probado todo lo probable para elimnar el error, que si todas las propiedades a null, que si función de destrucción, etc. etc. etc. y no hay manera. Siempre se quedan las putas Allocations sin liberar.

Esta tarde me he puesto en serio con ello y he descubierto el problema.

La clase tiene su propio observer para poder manejar el evento _Data por sí misma.
Pues bien en la función _Data tengo esta líneas de código:

....
If InStr(query.order, rs.fields[iInd].name) Then
....
 

Si la cambio por:

If InStr(LCase(query.order), LCase(rs.fields[iInd].name)) Then
....
 


Ya no se producen los warnings de Allocation non Freed.
Símplemente he llamado a la función lCase antes de hacer la búsqueda, para asegurarme de que la subcadena está o deja de estar en la cadena... y eso soluciona el tema.
       
Yo no entiendo nada
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Los Misterios Insondables De Las Allocations Non Freed 
 
Que extraño, porque la funcion LCase, lo que hace es poner en minúscula el texto...  
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Los Misterios Insondables De Las Allocations Non Freed 
 
tengo el mismo error, ni idea de como repararlo
 



 
tercoIDE - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Los Misterios Insondables De Las Allocations Non Freed 
 
tercoIDE escribió: [Ver mensaje]
tengo el mismo error, ni idea de como repararlo


¿Seguro que no estás usando la instrucción Quit para salir del programa?  En un programa gráfico lo normal es usar Me.Close para cerrar el formulario principal.

Ya hablamos algo sobre esto, relativo al programa estru3d...

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Los Misterios Insondables De Las Allocations Non Freed 
 
jguardon escribió: [Ver mensaje]
tercoIDE escribió: [Ver mensaje]
tengo el mismo error, ni idea de como repararlo


¿Seguro que no estás usando la instrucción Quit para salir del programa?  En un programa gráfico lo normal es usar Me.Close para cerrar el formulario principal.

Ya hablamos algo sobre esto, relativo al programa estru3d...

Saludos


efectivamente, me.Close hace un mejor trabajo

lo he probado en el programa de cubos giratorios, adonde recibia el error de las allocations,  pero me encontre con otro error:

Timer1.Start
  Do
    drwDibujo.Refresh
    
    Wait 0.01

    
    
  Loop Until flags.bye ' = True
Timer1.Stop


ese es el bucle principal que refresca la pantalla de opengl, al intentar salir con:

Public Sub Button2_Click()
    
  Me.close 'Quit

End


genero un error en drwDibujo.Refresh : Objeto Invalido, puesto que la ventana se cerro, pero el bucle siguio corriendo, que se soluciono agregando:

Public Sub Button2_Click()
  
  flags.bye = True 'esto hace que el bucle principal termine, Me.Close es suficientemente lento como para permitirlo
  
  Me.close 'Quit

End


en conclusion, hay que ordenar un poco las cosas al salir de casa  
 



 
tercoIDE - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Los Misterios Insondables De Las Allocations Non Freed 
 
jguardon escribió: [Ver mensaje]
tercoIDE escribió: [Ver mensaje]
tengo el mismo error, ni idea de como repararlo


¿Seguro que no estás usando la instrucción Quit para salir del programa?  En un programa gráfico lo normal es usar Me.Close para cerrar el formulario principal.

Ya hablamos algo sobre esto, relativo al programa estru3d...

Saludos


bueno, ha pasado el tiempo y las Allocations siguen ahi. Cierro con

me.Close()


pero esto sigue aqui, para mal, son muchisimas:

gbx3: warning: circular references detected:
gbx3:  77529094 flagsSTRUCT
gbx3:  1038336 maxSTRUCT
gbx3:  1867427 settingsSTRUCT
gbx3:  1842791 datosSTRUCT
gbx3:  945262 zoomSTRUCT
gbx3: warning: 83222910 allocation(s) non freed.

La verdad es que ni el mismo Benoit supo decirme la causa...
 



 
tercoIDE - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Los Misterios Insondables De Las Allocations Non Freed 
 
Pos no sé... sin ver tu proyecto no me atrevo a decir nada. ¿Lo has probado con otros escritorios o otras distros?
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Los Misterios Insondables De Las Allocations Non Freed 
 
tercoIDE, tiene razon el nuestro amigo shordi: hace falta el tu proyecto para darse cuenta del problema.  

En todo caso, generalmente aquel problema ocurre cuando el programa no ha sido cerrado correctamente y las asignaciones en memoria no han sido liberadas.
 



 
última edición por vuott el Miercoles, 23 Septiembre 2015, 23:23; editado 4 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Los Misterios Insondables De Las Allocations Non Freed 
 
El problema ocurre cuando el garbage collector no puede liberar la memoria de un objeto porque aún tiene referencias al cerrar el programa. En gambas, la memoria de un objeto es liberada cuando ya no se tienen referencias al mismo, cuando no es posible acceder desde ninguna variable. Si nosotros creamos un circulo de dependencias, es decir, una clase que tiene una referencia a otra, y esta otra tiene otra referencia a la primera, el programa que se encarga de liberar la memoria no puede saber cual puede o no eliminar, ya que siempre van a tener, por lo menos, una referencia. En algún lugar, están guardando una referencia a una instancia que a su vez tiene otra referencia al objeto original. Setear las variables a null es un primer paso, pero lo más simple es seguir en donde se crean los objetos, donde se guardan, y ver qué clases están involucradas. Solo con la definición de las estructuras no alcanza, por eso nadie en la lista pudo ayudarte, tercoIDE.

Es la opinion de varios que este problema, por lo menos en gambas, es el mas dificil de corregir. En aplicaciones hechas en C o C++ existen herramientas, como Valgrind, que permiten solucionarlo proveyendo la información que se necesita (Donde se aloco la memoria para el objeto, y cuando se perdio la referencia). En gambas, aun no tenemos herramientas de este estilo, por lo que todo debe hacerse de forma manual.
 



 
sebikul - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Los Misterios Insondables De Las Allocations Non Freed 
 
sebikul:

Citar:
  el programa que se encarga de liberar la memoria no puede saber cual puede o no eliminar, ya que siempre van a tener, por lo menos, una referencia

Y una pregunta o sujerencia de mejora:
Si el programa sabe que se el usuario quiere cerrar definitivamente  la aplicacion (por ejemplo crear una orden tipo "application.close()" ), hacer que "el programa que se encarga de liberar la memoria", directamente libere toda la memoria?

Saludos

Julio
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Linuxmint, Los Misterios De Las Actualizac... shordi Mundo Linux 5 Domingo, 03 Diciembre 2017, 09:06 Ver último mensaje
Shell
No hay nuevos mensajes Misterios De Cinnamon..., Digo Mint..., Di... shordi Mundo Linux 8 Miercoles, 20 Marzo 2019, 17:48 Ver último mensaje
tincho
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron