【发布时间】:2017-04-24 04:20:17
【问题描述】:
我在 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 是因为 if 是我想到的第一个返回动态数组的函数。最初的问题是在 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;
但是绕过我所有的应用程序来修改它们以解决这个错误并不是我的首选。如果可能的话,我更愿意找到有问题的例程并在内存中修补它。
如果有人遇到此问题并找到解决方法,我将不胜感激。否则,当/如果我找到合适的解决方法时,我会发布我的。
另外,如果问题在柏林仍然存在,请发表评论。
【问题讨论】:
-
柏林 Upd2 出现同样的错误。
-
从报告的带有通用
TList的错误来看,这似乎是一个雷区。