#delphi
Вопрос:
Иногда один использует System.Classes.MaxListSize
.
procedure GList.SetCapacity(NewCapacity: Integer);
begin
if (NewCapacity < FCount) or (NewCapacity > MaxListSize) then
Error(string(@SListCapacityError), NewCapacity);
if NewCapacity <> Capacity then
begin
SetLength(FList, NewCapacity);
end;
end;
Но это устарело.
const
MaxListSize = MaxInt div 16 deprecated;
Я получаю это предупреждение:
FrameworkgenericsшаблоныGList_Implementation.inc(215): предупреждение W1000: Символ «MaxListSize» устарел
Я полагаю, что он устарел для поддержки 64 бит.
Что может быть подходящей альтернативой для System.Classes.MaxListSize
того, чтобы поддерживать как 32, так и 64-разрядные версии?
Обновление #1 — 2021-10-06, Когда я сделаю следующее:
implementation
uses
System.Generics.Collections;
procedure DoSomething;
var
il: TList<integer>;
i: Integer;
begin
il := TList<integer>.Create;
try
for i := 0 to MaxInt do
il.Add(i);
finally
il.Free;
end;
end;
Я получаю исключение из памяти. Больше нет чека, не так ли?
Комментарии:
1. Для собственного кода Delphi он, по-видимому, выполняет работу по проверке
SetLength()
, и больше нет проверки SetCapacity по максимальному размеру списка. Таким образом, вы можете просто удалитьor (NewCapacity > MaxListSize)
или обернуть его в условные обозначения компилятора. Обратите внимание, что это довольно старое изменение.2. Я проверил это с
TList<T>
помощью . Чека больше нет. Я получаю исключение из памяти.3. Я получаю исключение из памяти. Больше нет чека, не так ли? Разве исключение памяти (вместо сбоя системы) не указывает на наличие проверки? Фиксированный предел, как и прежде, не имеет смысла в 64-разрядных системах, поскольку ограничивающим фактором является объем памяти.