Цитата:
Сообщение от Freeman
Простой пример:
Код:
.....
procedure TMainForm.Button1Click(Sender: TObject);
var
MyArray: array of TMyObject;
begin
SetLength(MyArray, 2);
MyArray[1] := TMyObject.Create;
SetLength(MyArray, 1);
MyArray[0] := TMyObject.Create;
end;
Вешаем обработчик на кнопку, запускаем диспетер задач, тыкаем, наслаждаемся.
|
Ну так такая же утечка памяти будет и со статическим массивом (без всяких SetLength):
Код:
procedure TMainForm.Button1Click(Sender: TObject);
var
MyArray: array [0..1] of TMyObject;
begin
MyArray[1] := TMyObject.Create;
MyArray[0] := TMyObject.Create;
end;
Или даже вообще без массивов:
Код:
procedure TMainForm.Button1Click(Sender: TObject);
var
MyObj0, MyObj1: TMyObject;
begin
MyObj1 := TMyObject.Create;
MyObj0 := TMyObject.Create;
end;
Повторю ещё раз - это не из-за того что массивы это зло, а из-за того, что объекты (экземпляры класса) не являются авторазрушаемыми сущностями из-за отсутствия у них механизма подсчёта ссылок (или чего нибудь типа того).
Или вот ещё небольшой пример того, почему разрушение массива не должно вызывать деструкторы объектов:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
A: array of TEdit;
i: Integer;
begin
// Находим нужные элементы управления на форме и помещаем в массив ссылки на них:
SetLength(A, FCount);
for i := 1 to FCount do
begin
A[i] := (FindComponent('Edit'+IntToStr(i)) as TEdit);
end;
// Теперь через массив удобно работать с этими элементами управления.
// А после выхода из этого обработчика динамический массив будет автоматически разрушен
// и что если при этом он вызовет деструкторы элементов управления?
// Они же пропадут с формы... Разве входило в планы разрушить интерфейс пользователю?
end;