Fugas de memoria de FireMonkey TMenuBar

Cree una nueva aplicación HD Firemonkey en Delphi XE2.

Coloque un TMenuBar en el formulario. Edite en tiempo de diseño y agregue un elemento de menú 'Foo', agregue un elemento secundario 'Bar'.

Activar los informes de fugas de memoria en .dpr

ReportMemoryLeaksOnShutdown := true;

Ejecute la aplicación. Haga clic en 'Barra' tantas veces como quiera ...

¿Soy solo yo o abundan las pérdidas de memoria?

TList x2 Desconocido x1 Posición x4 TBounds x3, Desconocido x1 TPopup x1

(por clic)

¿Debería preocuparme por esto?

preguntado el 08 de noviembre de 11 a las 14:11

¿Ha presentado esto ante Embarcadero QC? Arreglan cosas como esta, ya sabes, o al menos lo explican. -

Informe de control de calidad registrado gracias. ¿No debería usar TMenuBar hasta que esto se solucione o la recolección de basura de Delphi se ocupará de esto y en realidad no es una preocupación real? ¿En qué momento una pérdida de memoria como esta se convierte en una preocupación real? Obviamente, en este caso, la pérdida de memoria se agrava cada vez que hace clic en el elemento del menú, que es algo a tener en cuenta. -

Cualquier pérdida de memoria es una preocupación, pero realmente no tiene muchas opciones además de TMenuBar. Embarcadero saldrá con actualizaciones de Firemonkey casi mensualmente, por lo que es posible que se solucione en un futuro próximo. -

Gracias por informar de esto. Haz que tus amigos voten sobre el informe. Desafortunadamente, mis votos se agotaron. -

¡No deberíamos tener que votar sobre esto, es una pérdida de memoria y debería arreglarse! Pero sé lo que estás diciendo. -

1 Respuestas

Todos ellos son propiedad de Popup en TMenuItem.Popup () en FMX.Menus.

Si libera el objeto emergente al final, todas las fugas desaparecen.

Es un error flagrante, pero se soluciona fácilmente.

Modifiqué el archivo de origen y lo coloqué en la carpeta de mi proyecto hasta que publicaron la corrección de errores.

respondido 09 nov., 11:21

no estoy seguro de lo que me estoy perdiendo aquí, intenté: type TNewMenuItem = class(TMenuItem) procedure PopUp; override; end; pero obtengo un error del compilador: no puedo anular el método no virtual. Lo suficientemente justo. Así que intenté: type TNewMenuItem = class(TMenuItem) procedure PopUp; reintroduce; end; pero la implementación de FMX.Menus todavía se llama. Luego intenté declarar: procedure NewPopUp; y asignando mi MenuItem.PopUp a este nuevo procedimiento, pero obtengo un error de 'no se puede asignar el lado izquierdo a'. ¿Cómo implementaste esto? - Steve Magness

@ Steve, arreglé el problema en el archivo fuente FMX.Menus y lo copié en mi archivo de proyecto local. Pensé que podrías ocultar el método, pero no lo probé. Modificaré mi respuesta. Al parecer, existen otras barreras. - Marcus Adams

¿Podrías publicar el fragmento de código que actualizaste? Si llamo a FreeAndNil (Popup) en la sección final de TMenuItem.Popup, obtengo una fuga de memoria multi-libre usando EurekaLog. Es cierto que si desactivo EurekaLog y dejo ReportMemoryLeaksOnShutdown activado, las pérdidas de memoria ya no se informan, pero me inclino a creer que EurekaLog es correcto. - Steve Magness

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.