|
Página 1 de 2
|
Los Misterios Insondables De Las Allocations Non Freed
Autor |
Mensaje |
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
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:
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
|
#1 Miercoles, 08 Enero 2014, 20:30 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
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...
|
#2 Miercoles, 08 Enero 2014, 20:51 |
|
|
tercoIDE
Analista Programador
Registrado: Noviembre 2013
Mensajes: 713
Edad: 54
|
Re: Los Misterios Insondables De Las Allocations Non Freed
tengo el mismo error, ni idea de como repararlo
|
#3 Jueves, 09 Enero 2014, 01:43 |
|
|
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
Re: Los Misterios Insondables De Las Allocations Non Freed
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"
|
#4 Jueves, 09 Enero 2014, 21:00 |
|
|
tercoIDE
Analista Programador
Registrado: Noviembre 2013
Mensajes: 713
Edad: 54
|
Re: Los Misterios Insondables De Las Allocations Non Freed
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:
ese es el bucle principal que refresca la pantalla de opengl, al intentar salir con:
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
|
#5 Viernes, 10 Enero 2014, 16:07 |
|
|
tercoIDE
Analista Programador
Registrado: Noviembre 2013
Mensajes: 713
Edad: 54
|
Re: Los Misterios Insondables De Las Allocations Non Freed
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...
|
#6 Miercoles, 23 Septiembre 2015, 20:07 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
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
|
#7 Miercoles, 23 Septiembre 2015, 20:32 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
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
|
#8 Miercoles, 23 Septiembre 2015, 23:13 |
|
|
sebikul
Sebastian
Programador
Registrado: Julio 2012
Mensajes: 113
Edad: 30 Ubicación:
|
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.
|
#9 Jueves, 24 Septiembre 2015, 04:42 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
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
|
#10 Jueves, 24 Septiembre 2015, 09:27 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 2
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
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
|
|
|
|
|