DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: Rogerdib
今日帖子: 1
在线用户: 3
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 dmzn (dmzn) ★☆☆☆☆ -
盒子活跃会员
2021/4/29 16:42:07
标题:
匿名函数作为局部变量使用时注意内存泄漏 浏览:236
加入我的收藏
楼主: 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一直没有脱离作用域.
----------------------------------------------
生活愉快.
作者:
男 tulater (tulater) ★☆☆☆☆ -
普通会员
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;
----------------------------------------------
生活愉快.
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行166.0156毫秒 RSS