gpt4 book ai didi

delphi - 如何阻止这种变体内存泄漏?

转载 作者:行者123 更新时间:2023-12-03 15:55:31 25 4
gpt4 key购买 nike

我使用的是旧的脚本引擎,其创建者不再支持该引擎,并且遇到内存泄漏问题。它使用 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;

编辑:回答罗布·肯尼迪在评论中的问题:

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 函数中的变体来实现的。 (在这种情况下,更改函数的返回类型将不起作用。)

最佳答案

您是否尝试过与字符串相同的技巧,除了使用 Variant 时,您应该使用 UnAssigned 而不是 Null 来释放它,就像您所做的那样 s := ''; 表示字符串。

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

关于delphi - 如何阻止这种变体内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3639113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com