内存泄漏superobject

这几天在移植代码,将之前的项目移植到插件框架里面,因为之前是单EXE的。对内存泄漏问题不是很在意。在DLL下面就不一样了,所以加入FastMM4来做监控调试。发现之前的ScripParser解析SQL时存在内存泄漏。

 

其中有段代码

 

var
  lvItem            : TSuperObjectIter;
begin
  if ObjectFindFirst(vParam, lvItem) then
  try
    repeat
      FScript := FastReplace(FScript, lvItem.key, FParamSetValue.S[LowerCase(lvItem.key)]);
    until not ObjectFindNext(lvItem);
  finally
    ObjectFindClose(lvItem);
  end;
 
存在内存泄漏,后来查看ObjectFindFirst的时候才发现了问题

function ObjectFindFirst(const obj: ISuperObject; var F: TSuperObjectIter): boolean;
var
  i: TSuperAvlEntry;
begin
  if ObjectIsType(obj, stObject) then
  begin
    F.Ite := TSuperAvlIterator.Create(obj.AsObject);
    F.Ite.First;
    i := F.Ite.GetIter;
    if i <> nil then
    begin
      f.key := i.Name;
      f.val := i.Value;
      Result := true;
    end else
      Result := False;   

     //原来返回False也有可能创建了

    //F.Ite := TSuperAvlIterator.Create(obj.AsObject);
  end else
    Result := False;
end;

 

///最后修改代码,没有了内存泄漏

var
  lvItem            : TSuperObjectIter;
begin
  try 
    if ObjectFindFirst(vParam, lvItem) then
    repeat
      ……
    until not ObjectFindNext(lvItem);
  finally
    if lvItem.Ite <> nil then ObjectFindClose(lvItem);
  end;

转载于:https://www.cnblogs.com/DKSoft/archive/2011/04/24/2026256.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值