Показать сообщение отдельно
  #33  
Старый 31.03.2014, 00:23
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от 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;
Ответить с цитированием