gpt4 book ai didi

string - Delphi 7,字符串问题

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

在我的项目中,我遇到了字符串“内存不足异常”的问题,未使用 MM。该问题显示当字符串长度达到 2 300,000 个符号时。尽管有足够的内存,并且在代码的同一部分中,我可以创建一个包含 100,000,000 个字符的字符串。

Google 没有帮助,我无法反汇编它(没有技能),所以我决定创建一个最小的测试示例,在其中我可以在少于 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 次迭代一次,它一定不会减慢。

问题:

  1. Delphi 中的默认字符串如何工作?

  2. 如何避免速度变慢?

  3. 如何避免内存不足?

附注如果我将 FastMM 包含到主项目中,错误就会消失p.p.s 未注释字符串的示例在 3 分钟内将我的 Windows 7 发送至 BSOD(从用户模式)。

最佳答案

通过执行分配字符串

s := s + '{' +  b + '}';

在长时间运行的循环中只会让你的内存碎片化。您可能有足够的内存来存储该字符串,但这还不够。您需要内存是连续的,但您的分配模式会使这变得困难。

通过调用 SetLength 将字符串预先分配到其最终所需的长度来解决该问题。

关于string - Delphi 7,字符串问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10122338/

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