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' वास्तव में मुक्त होता है और पॉलीमोर्फिज्म प्रतिमान का उपयोग करके एक उदाहरण बनाता है, लेकिन इसकी आवश्यकता नहीं है। मैं केवल यह इंगित करना चाहता हूं कि डिज़ाइन वही रहना चाहिए।क्यों एक मेम रिसाव है और इसे कैसे ठीक किया जाए?
अब प्रश्न और समस्या - ऐसा क्यों होता है और इसे कैसे ठीक किया जाए? ऐसा लगता है कि 'अगर असाइन किया गया (ओ 2)' फिट नहीं है।
मुझे क्या लगता है: my.o2 पर पॉइंटर भेजना मुक्त होगा और शून्य ओ 2 और मैं ऐसा करने की कोशिश करता हूं, लेकिन मैं संदेश हैंडलर में ऑब्जेक्ट से ऑब्जेक्ट में कनवर्ट नहीं कर सका, मुझे कोई जानकारी नहीं मिली।
कोई भी हाथ दे सकता है? धन्यवाद
'करता अमान्य सूचक आपरेशन => मेम वास्तव में leak' लाइन में हैं o2': = Tobject.Create; ' – mjn
@mjn। यह शायद विनाशक में इसी पंक्ति से संबंधित है। :) – GolezTrol
संदेश संख्याओं के लिए आप WM_APP से अधिक मूल्यों का बेहतर उपयोग करेंगे। 6 WM_ACTIVATE है, और परेशानी का कारण बन सकता है। – GolezTrol