大佬教程收集整理的这篇文章主要介绍了delphi – 为什么会出现内存泄漏以及如何修复它?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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)) 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’实际上是Frees AND使用多态范例创建一个实例,但这不是必需的.我只想指出设计应该保持不变.
现在问题和问题 – 为什么会发生以及如何解决它?似乎’如果Assigned(o2)’不适合它.
我的想法:发送一个指向my.o2的指针将自由和nil o2我尝试这样做,但我无法在消息处理程序中从指针转换为对象,不知道为什么.
有人可以伸手吗?谢谢
你认为你在调用FreeMyObject时将o2设置为nil但你不是.实际上,您将msg.lParam设置为0.
o2是一个包含对象引用的变量.您传递的是o2的值,当您通过值传递时,您无法修改传递其值的变量.所以你需要传递对o2的引用.为此,您需要添加额外的重定向级别并将指针传递给o2,如下所示:
if(msg.message=6) then begin FreeAndNil(PObject(msg.lParam)^); Exit; end; ... PostThreadmessage(l.ThreadID,LPARAM(@my.o2));
你不需要FreeMyObject,你可以直接调用FreeAndNil.而且您不需要在消息中传递实例.
我希望你的真实代码不像这样奇怪!
以上是大佬教程为你收集整理的delphi – 为什么会出现内存泄漏以及如何修复它?全部内容,希望文章能够帮你解决delphi – 为什么会出现内存泄漏以及如何修复它?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。