我正在使用一个旧的脚本引擎,它的创建者不再支持它,并且在内存泄漏方面遇到了一些麻烦。它使用ASM编写的函数从脚本调用Delphi函数,并将结果作为整数返回,然后将该整数作为无类型参数传递给另一个将其转换为正确类型的过程。
这适用于大多数事情,但是当Delphi函数的返回类型是Variant时,它会泄漏内存,因为变体永远不会被处理掉。有谁知道如何获取包含变量的无类型参数并确保它将被正确处理?这可能涉及一些内联汇编。
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的问题:
AnsiString转换的工作原理如下:
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函数中的变体来实现。 (在这种情况下,更改函数的返回类型将不起作用。)
答案 0 :(得分:3)
您是否尝试过与字符串相同的技巧,除了使用Variant之外,您应该使用UnAssigned
代替Null
来释放它,就像您为字符串s := '';
做的那样。
顺便说一下,我能想到的唯一原因之一就是需要明确地释放字符串,Variants等......就是在使用ThreadVar
时。