我正在使用从.Net移植到Delphi 7的a TStringBuilder class。
这是我的代码段:
procedure TForm1.btn1Click(Sender: TObject);
const
FILE_NAME = 'PATH TO A TEXT FILE';
var
sBuilder: TStringBuilder;
I: Integer;
fil: TStringList;
sResult: string;
randInt: Integer;
begin
randomize;
sResult := '';
for I := 1 to 100 do
begin
fil := TStringList.Create;
try
fil.LoadFromFile(FILE_NAME);
randInt := Random(1024);
sBuilder := TStringBuilder.Create(randInt);
try
sBuilder.Append(fil.Text);
sResult := sBuilder.AsString;
finally
sBuilder.free;
end;
mmo1.Text := sResult;
finally
FreeAndNil(fil);
end;
end;
showmessage ('DOne');
end;
我遇到了AV错误。当我创建大小倍数为1024的内存时,我可以缓解这个问题,但有时它仍然会发生。
我做错了吗?
答案 0 :(得分:11)
你的代码很好。您正在使用的TStringBuilder代码有问题。考虑这种方法:
procedure TStringBuilder.Append(const AString : string);
var iLen : integer;
begin
iLen := length(AString);
if iLen + FIndex > FBuffMax then _ExpandBuffer;
move(AString[1],FBuffer[FIndex],iLen);
inc(FIndex,iLen);
end;
如果当前缓冲区大小的未来长度太长,则扩展缓冲区。 _ExpandBuffer
将缓冲区的大小加倍,但一旦完成,它就不会检查新的缓冲区大小是否足够。如果原始缓冲区大小为1024,并且您正在加载的文件为3 KB,那么将缓冲区大小加倍到2048仍然会使缓冲区在Append
中过小,并且最终将覆盖1024字节以上缓冲区的结尾。
将if
更改为while
中的Append
。