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.
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
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
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