我使用的是一个旧的脚本引擎,它不再受其创建者的支持,并且在内存泄漏方面遇到了一些问题。它使用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函数中的变量来实现这一点。(在这种情况下,更改函数的返回类型将不起作用。)