Joh*_*ohn 4 delphi stringbuilder getmem
我正在使用从.Net移植到Delphi 7 的TStringBuilder类.
这是我的代码片段:
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;
Run Code Online (Sandbox Code Playgroud)
我遇到了AV错误.当我创建大小倍数为1024的内存时,我可以缓解这个问题,但有时它仍然会发生.
难道我做错了什么?
Rob*_*edy 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;
Run Code Online (Sandbox Code Playgroud)
如果当前缓冲区大小的未来长度太长,则扩展缓冲区._ExpandBuffer将缓冲区的大小加倍,但一旦完成,它就不会检查新的缓冲区大小是否足够.如果原始缓冲区大小为1024,并且您加载的文件是3 KB,那么将缓冲区大小加倍到2048仍然会使缓冲区太小Append,并且最终会覆盖超出缓冲区末尾的1024个字节.
更改if到while在Append.
| 归档时间: |
|
| 查看次数: |
384 次 |
| 最近记录: |