natknąłem się na błąd w Delphi 10 Seattle Aktualizacja 1. Weźmy następujący kod:Jak obejść błąd Delphi 10 z TList <_AnyDynamicArrays_>?
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;
na pierwszy rzut oka wydaje się, że TList<T>
nie właściwie zarządzać żywotność dynamicznych tablic zawiera, ale z drugiej strony, działa dobrze, jeśli skompilowany w 64 bitach, tylko zawiesza się w 32 bitach (Rozumiem, że to nie znaczy, że błąd nie występuje w 64 bitach ...).
Należy pamiętać, że SplitString został użyty, ponieważ jeśli była pierwszą funkcją zwracającą dynamiczną tablicę, która przyszła mi do głowy. Pierwotny problem napotkano na TList<TBookmark>
, który wykazuje ten sam problem.
Jest możliwość obejścia błędu Procedura przepisywania Button1Click tak:
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;
Ale dzieje wokół wszystkie moje aplikacje modyfikując je w celu obejścia tego błędu to naprawdę nie jest mój preferowany opcję. Wolałbym znaleźć szkodliwą rutynę i załatwić ją w pamięci, jeśli to możliwe.
Jeśli ktoś napotkał ten problem i znalazł obejście, byłbym wdzięczny. W przeciwnym razie, opublikuję moje, gdy/jeśli znajdę odpowiednie obejście.
Proszę również o komentarz, jeśli problem nadal występuje w Berlinie.
sam błąd w Berlinie Upd2. –
Od zgłoszonych błędów z typowym 'TList', wydaje się, że jest to pole minowe. –