我是一个有用的助手,可以进行文本翻译。
我在 Delphi 10 Seattle Update 1 中发现了一个错误。我们来看以下代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
//----------We crash here----------------
FList.Items[0] := SplitString('H:E', ':');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FList := TList<TStringDynArray>.Create;
FList.Add(SplitString('H:E', ':'));
FList.Items[0] := SplitString('H:E', ':');
end;
乍一看,
TList<T>
似乎没有正确管理其包含的动态数组的生命周期,但如果以64位编译,则它可以正常工作,只有在32位崩溃(我明白这并不意味着64位不存在该错误...)。请注意,使用了SplitString函数,因为它是我能想到的第一个返回动态数组的函数。原始问题出现在
TList<TBookmark>
上,该问题表现相同。可以通过像这样重写Button1Click程序来解决该错误:
procedure TForm1.Button1Click(Sender: TObject);
var MyArray : TStringDynArray;
begin
MyArray := FList.Items[0];
FList.Items[0] := SplitString('H:E', ':');
//----------Yeah! We don't crash anymore!-----------
end;
但是逐一修改我的所有应用程序以解决这个 bug 并不是我首选的选项。如果可能的话,我更愿意找到问题所在的例程并在内存中打补丁。
如果有人遇到这个问题并找到了解决方法,我将不胜感激。否则,如果我找到了一个适当的解决方法,我会发布我的方法。
如果问题仍然存在于柏林,请留言告知。
TList
的错误来看,它似乎是一个雷区。 - LU RD