在我的项目中,我遇到了字符串“内存不足异常”的问题,没有使用 MM。问题显示当字符串的长度达到 2 300,000 个符号时。尽管有足够的内存并且在同一部分代码中,我可以创建一个包含 100,000,000 个字符的字符串。
谷歌没有帮助,我无法反汇编它(没有技能),所以我决定创建一个最小的测试示例,我可以在少于 2 000 000 000 个符号的字符串上出现内存不足异常。我无法创建这样的示例,但我创建了一些奇怪的东西:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var s : string;
k : integer;
function b : string;
begin
result := 'f';
end;
procedure c;
var ss : string;
begin
s := s + '{' + b + '}';
ss := 'a';
if k mod 100001 = 0 then
begin
// ss[1] := 'd'; // uncoment me
write(k mod 10);
end;
inc(k);
end;
begin
while true do c;
end.
这段代码工作正常。它只是通过一些额外的操作向全局字符串添加一些内容。问题是,如果您取消注释标记的字符串,它会显着减慢(无论是否优化)。考虑到这个赋值在 100,001 次迭代中一次,它一定不会慢下来。
问题:
Delphi 中的默认字符串是如何工作的?
如何避免减速?
如何避免内存不足?
PS 如果我将 FastMM 包含到主项目中,则错误消失 pps 未注释字符串的示例在 3 分钟内(从用户模式)将我的 Windows 7 发送到 BSOD。