|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
dmzn (dmzn) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2021/4/29 16:42:07 |
标题: |
匿名函数作为局部变量使用时注意内存泄漏 |
浏览:1076 |
|
加入我的收藏 |
楼主: |
IDE环境: 10.2.3 组件: uniGUI 1.9.0.1514, FastMM4
type TMyFun = reference to procedure (const nText: string); //声明匿名函数
procedure TMainForm.UniButton1Click(Sender: TObject); var nFun: TMyFun; begin nFun := procedure (const nText: string) begin //空操作 end;
Prompt('hello', '', mtInformation, mbOKCancel, //A.第4个参数为匿名函数,用于处理用户输入完毕后的点击事件 procedure (Sender: TComponent; AResult:Integer; AText: string) begin nFun(AText); //nFun := nil; //在匿名回调中使用nFun匿名变量,若不明确释放,则内存泄漏. end); end;
由于没有uniGUI的代码,猜测是Prompt方法存放了 A函数,引起nFun一直没有脱离作用域.
----------------------------------------------
生活愉快. |
作者: |
|
2021/4/29 17:21:20 |
1楼: |
学习了,谢谢你dmzn
----------------------------------------------
http://www.cnblogs.com/tulater/
|
作者: |
dmzn (dmzn) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2021/4/29 17:28:21 |
1楼: |
已成功还原出内存泄漏的原因:
type TMyFun = reference to procedure (const nText: string); //声明匿名函数
var gFun: TMyFun;
procedure Prompt(const nMsg: string; nFun: TMyFun); begin gFun := nFun; //保存为全局变量 end;
procedure TfFormAdminPwd.FormCreate(Sender: TObject); var nFun: TMyFun; begin nFun := procedure (const nText: string) begin //空操作 end;
Prompt('hello', procedure (const nText: string) //该方法存为全局变量后,导致nFun无法脱离作用域 begin nFun(nText); end); end;
----------------------------------------------
生活愉快.
|
|