2011-09-29 16 views
7

Trabajando en un proyecto que usa fábricas para construir objetos. Guardo los punteros a las funciones de fábrica en vars globalmente (lo sé mal) y los registro en la inicialización.Problema de memoria Delphi (FastMM4)

Hace poco estuve interesado en ver si el proyecto tenía pérdidas de memoria, así que decidí descargar FastMM4 y echar un vistazo. Se me ocurrieron algunos errores que pude corregir, pero este que estoy un poco perplejo parece que no libere la memoria relacionada con la fábrica, como se muestra en el siguiente código. Tengo una pequeña pérdida de memoria. No es ridículo, pero molesto, sin embargo.

¿Qué utilizaría para liberar la memoria (si es eso) que he intentado eliminar (@factoryfunction) pero parece destruir todo. No soy muy bueno con cosas de puntero de bajo nivel que siempre me confunden, así que si alguien pudiera ayudar, sería genial.

He incluido un ejemplo a continuación que acabo de escribir en la parte superior de mi cabeza que ilustra el problema que estoy teniendo.

Saludos,

Barry

unit Test; 

interface 

uses classes; 

type 

TAFactoryFunction = reference to function (const aType : integer): TObject; 

function testfunction (const aType : integer) : TObject; 

implementation 

function testfunction(const aType: integer) : TObject; 
begin 
    result := TObject.Create; 
end; 

var 
    FactoryFunction : TAFactoryFunction 

initialization 
    FactoryFunction := testfunction; 

finalization 
    // possibly some freemem code here? 

end. 
+0

Tengo curiosidad: ¿por qué está utilizando una "referencia a la función" en lugar de un tipo de función simple? Esto evitaría la pérdida de memoria, ya que no implicaría que el compilador saltara por los aros para lograr lo que se puede lograr de forma más simple. ¿O es este uno de esos casos donde el ejemplo simplificado no refleja completamente el escenario original? – Deltics

+0

al igual que la relativa flojedad del tipeo con ella, por lo que la variable puede tomar procedimientos, métodos o métodos anónimos. Se está utilizando para un marco, por lo que quiero que sea lo más extensible posible. – Barry

+0

No estoy seguro de que esto lo permita, ¿o sí? La referencia todavía tiene que ser para una función de la firma apropiada, ¿no? ¡Si no, diría que es una razón para evitar este tipo de cosas como la peste! si declaro que un tipo es una función con una firma determinada, será mejor utilizarlo como tal. Cualquier otra cosa es pedir un dolor de cabeza de mantenimiento (sin mencionar la confusión). Y la pregunta sigue siendo, ¿por qué quiere permitir esta flexibilidad, aparte de porque puede/desea? ¿Para qué sirve la flexibilidad en su marco? – Deltics

Respuesta

5

Acabo de probar esto en Delphi 2010 y que parece ser un error. El compilador debe generar código para limpiar eso, pero no es así. Incluso escribir FactoryFunction := nil, como sugirió David, no funciona.

Debe informar esto en QC como un error.

+0

Parece haber una llamada extra a 'IntfCopy' que da como resultado que el recuento de referencias se establezca en 2. No tengo idea de por qué es así. –

Cuestiones relacionadas