在我的项目中,我遇到了与字符串“内存溢出异常”相关的问题,没有使用MM。当字符串长度达到230万字符时,该问题就会出现。尽管有足够的内存,在代码的同一部分,我可以创建一个包含1亿个字符的字符串。
谷歌并没有帮助我解决这个问题,我也不能对其进行分解(因为我没有相关技能),所以我决定创建一个最小化测试示例,以便在少于20亿个字符的字符串上获取内存溢出异常。然而,我无法创建这样的示例,但我创建了一些更奇怪的东西:
这段代码很好用。它将某些额外操作添加到全局字符串中。问题在于,如果取消标记的字符串,则会显着减慢速度(无论是否优化)。考虑到这个值在100,001次迭代中只赋值一次,它不应该放慢速度。
问题:
谷歌并没有帮助我解决这个问题,我也不能对其进行分解(因为我没有相关技能),所以我决定创建一个最小化测试示例,以便在少于20亿个字符的字符串上获取内存溢出异常。然而,我无法创建这样的示例,但我创建了一些更奇怪的东西:
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中的默认字符串是如何工作的?
- 如何避免减速?
- 如何避免内存溢出?