- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用的是旧的脚本引擎,其创建者不再支持该引擎,并且遇到内存泄漏问题。它使用 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/
我有 json 数据: { "products": [ { "productId" : 0, "productImg" : "../img/product-ph
我是一名优秀的程序员,十分优秀!