Delphi 如何阻止此变体内存泄漏?

Delphi 如何阻止此变体内存泄漏?,delphi,assembly,variant,Delphi,Assembly,Variant,我使用的是一个旧的脚本引擎,它的创建者不再支持它,而且内存泄漏也有一些问题。它使用ASM中编写的函数从脚本调用Delphi函数,并将结果作为整数返回,然后将该整数作为非类型化参数传递给另一个过程,该过程将其转换为正确的类型 这在大多数情况下都可以正常工作,但是当Delphi函数的返回类型为Variant时,它会泄漏内存,因为Variant永远不会被处理。有人知道我如何接受包含变量的非类型化参数并确保它将被正确处理吗?这可能会涉及一些内联程序集 procedure ConvertVariant(v

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

这在大多数情况下都可以正常工作,但是当Delphi函数的返回类型为Variant时,它会泄漏内存,因为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函数中的变量实现的。(在这种情况下,更改函数的返回类型将不起作用。)

您是否尝试过与字符串相同的技巧,只是对于一个变量,您应该将
未分配的
而不是
Null
释放它,就像您使用
s:=''


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

时,变量最初是如何进入第一个参数的?实际参数使用的变量类型是什么?当你说它适用于“大多数事情”时,这是否包括AnsiString?对该参数的处理应类似于对变量的处理。@Rob:更新了您的问题的答案。我仍然想知道第一个参数是如何填充的。也就是说,如何调用
ConvertVariant
StringToVar
?泄漏的是第一个参数中的变量,对吗?Mason,你试过使用varclear函数吗?我怀疑您的“过程StringToVar;”可能只是:“asm jmp VarFromString2 end;”……或者如果代码正在执行一些低级操作,这些操作会干扰编译器自动生成清理代码的能力。我试过了,但每次运行时仍会看到内存使用量不断增加。这是我必须测试的唯一指示,因为FastMM没有分配变量,也没有在内存泄漏报告中显示。但它的下降幅度相当大,这意味着这是有帮助的,还有其他东西泄漏(