内存泄漏superobject

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

这几天在移植代码,将之前的项目移植到插件框架里面,因为之前是单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;
目录
相关文章
|
8月前
|
监控 NoSQL Java
遇到内存泄漏
遇到内存泄漏
96 0
|
2月前
|
JavaScript 前端开发 Java
垃圾回收机制会导致内存泄漏吗?
【10月更文挑战第29天】虽然JavaScript的垃圾回收机制本身是为了有效地管理内存,但开发者在编写代码时需要注意上述这些可能导致内存泄漏的情况,遵循良好的编程习惯,及时释放不再使用的资源,以确保程序能够高效地利用内存资源,避免出现内存泄漏问题。
|
3月前
|
C++
内存泄漏
【10月更文挑战第11天】
43 4
|
8月前
|
存储 Java Android开发
内存泄露
内存泄露
47 2
内存泄露
|
8月前
|
缓存 算法 Java
容易发生内存泄漏的八个场景,你都知道吗?
容易发生内存泄漏的八个场景,你都知道吗?
|
8月前
|
存储 C++
什么是内存泄漏?如何避免内存泄漏?
什么是内存泄漏?如何避免内存泄漏?
65 0
|
缓存 JavaScript Java
什么是内存泄漏?什么原因会导致呢?
什么是内存泄漏?什么原因会导致呢?
83 0