代码之家  ›  专栏  ›  技术社区  ›  Mason Wheeler

如何阻止此变量内存泄漏?

  •  3
  • Mason Wheeler  · 技术社区  · 14 年前

    我使用的是一个旧的脚本引擎,它不再受其创建者的支持,并且在内存泄漏方面遇到了一些问题。它使用asm中编写的函数从脚本调用Delphi函数,并以整数形式返回结果,然后将该整数作为非类型化参数传递给另一个将其转换为正确类型的过程。

    这对大多数事情都很好,但是当delphi函数的返回类型是变量时,它会泄漏内存,因为变量永远不会被处理掉。有人知道我如何获取包含变量的非类型化参数并确保它被正确地处理吗?这可能涉及一些内联程序集。

    procedure ConvertVariant(var input; var output: variant);
    begin
      output := variant(input);
      asm
        //what do I put here? Input is still held in EAX at this point.
      end;
    end;
    

    编辑:在评论中回答Rob Kennedy的问题:

    传送转换的工作方式如下:

    procedure VarFromString2(var s : AnsiString; var v : Variant);
    begin
      v := s;
      s := '';
    end;
    
    procedure StringToVar(var p; var v : Variant);
    begin
      asm
        call VarFromString2
      end;
    end;
    

    这样做很好,不会产生内存泄漏。当我尝试用变量做与输入参数相同的事情,并分配原始变量 Null 在第二个过程中,内存泄漏仍然会发生。

    这些变量主要包含字符串——所讨论的脚本用于生成XML——它们通过将delphi字符串分配给该脚本调用的delphi函数中的变量来实现这一点。(在这种情况下,更改函数的返回类型将不起作用。)

    1 回复  |  直到 14 年前
        1
  •  3
  •   Francesca    14 年前

    您是否尝试过与字符串相同的技巧,除了使用变量之外,您应该 UnAssigned 而不是 Null 像你一样释放它 s := ''; 对于字符串。

    顺便说一下,我能想到的唯一原因之一就是需要显式地释放字符串、变量等。在使用时 ThreadVar .