unit Unit7;
interface
uses Classes;
type
TListener = class(TThread)
procedure Execute; override;
end;
TMyClass = class
o1,o2: Tobject;
procedure FreeMyObject(var obj: TObject);
constructor Create;
destructor Destroy; override;
end;
implementation
uses Windows, SysUtils;
var l: TListener;
my: TMyClass;
procedure TListener.Execute;
var msg:TMsg;
begin
while(GetMessage(msg, Cardinal(-1), 0, 0)) do
if(msg.message=6) then begin
TMyClass(msg.wParam).FreeMyObject(TObject(msg.lParam));
Exit;
end;
end;
constructor TMyClass.Create;
begin
inherited;
o1:=TObject.Create;
o2:=Tobject.Create; // Invalid pointer operation => mem leak
end;
destructor TMyClass.Destroy;
begin
if(Assigned(o1)) then o1.Free;
if(Assigned(o2)) then o2.Free;
inherited;
end;
procedure TMyClass.FreeMyObject(var obj: TObject);
begin
FreeAndNil(obj);
end;
initialization
l:= TListener.Create();
my:=TMyClass.Create;
sleep(1000); //make sure the message loop is set
PostThreadMessage(l.ThreadID, 6, Integer(my), Integer(my.o2));
finalization
l.Free;
my.Free;
end.
Utilicé el controlador de mensajes para ilustrar mi problema tal como está, para que lo entienda. El diseño real es mucho más complicado. La función 'FreeMyObject' en realidad libera Y crea una instancia usando un paradigma de polimorfismo, pero esto no es necesario. Solo quiero señalar que el diseño debe permanecer igual.¿Por qué hay una pérdida de memoria y cómo solucionarlo?
Ahora la pregunta y el problema: ¿por qué sucede Y cómo solucionarlo? Parece 'si Assigned (o2)' no cabe.
Lo que pienso: Enviar un puntero a my.o2 sería gratis y nulo o2 y trato de hacerlo, pero no pude convertir de puntero a objeto en el manejador de mensajes, no tengo idea de por qué.
¿Alguien podría ayudarlo? Gracias
¿El 'operación puntero no válido => mem leak' pertenece realmente en la línea' o2: = Tobject.Create; ' – mjn
@mjn. Probablemente pertenece a la línea correspondiente en el destructor. :) – GolezTrol
Será mejor que use valores superiores a WM_APP para los números de mensaje. 6 es WM_ACTIVATE y puede causar problemas. – GolezTrol