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.
我用消息處理程序來說明我的問題,因此您瞭解它。真正的設計要複雜得多。函數'FreeMyObject'實際上釋放並創建一個使用多態主義範例的實例,但這裏不需要。我只想指出,設計應該保持不變。爲什麼有一個mem泄漏,以及如何解決它?
現在的問題和問題 - 爲什麼發生和如何解決它?看起來「如果分配(o2)」不適合它。
我的想法是:發送一個指向my.o2的指針會釋放並且無o2,我試圖這樣做,但是我不能將指針轉換爲消息處理程序中的對象,不知道爲什麼。
有人可以舉手嗎?謝謝
是否'無效指針操作=> MEM leak'確實在該行屬於'O2: = Tobject.Create;' – mjn
@mjn。它可能屬於析構函數中的相應行。 :) – GolezTrol
您最好使用比WM_APP更高的值作爲消息編號。 6是WM_ACTIVATE,可能會造成麻煩。 – GolezTrol