Перейти к содержанию
Fire Monkey от А до Я
  • 0

Правильное удаление потомков


Alex7wrt

Вопрос

Есть глобальный массив объектов  

var comp: array [1..12] of TRectangle;

В процедуре создаю сами объекты и по 2 потомка к каждому из них

procedure .........................
var element1, element2: TRectangle;
       i: byte;
begin
   for i:=1 to n do begin
       comp[i]:=TRectangle.Create(form1);
       comp[i].Parent:=form1;
       .......................
       element1:=TRectangle.Create(comp[i]);
       element1.Parent:=comp[i];
       ........................
       element2:=TRectangle.Create(comp[i]);
       element2.Parent:=comp[i];
       .........................
       end;
end;

В теле другой процедуры уничтожаю все объекты

procedure .........................
var i: byte;
begin
       for i:=1 to n do comp[i].free;
end;

Все как-бы работает. Но после многократного повторения этих процедур программа работает все медленнеее и медленнее с каждой следующей операцией создания-удаления. При этом никаких новых компонентов не создается.

 

Поэтому и появились мысли, что не все компоненты удалены. Возможно остались неудаленными потомки.

 

Пробовал изменить тело процедуры удаления на: 

    for i:=1 to n do begin
        for j:=0 to comp[i].ChildrenCount-1 do comp[i].Children[j].Free;
        comp[i].Free;
   end;

Но ничего не меняется. Поэтому прошу совета, в чем  может быть причина замедления программы и как  правильно удалять потомки. Программа для Android.

Изменено пользователем Brovin Yaroslav
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Администраторы

В Delphi есть встроенный механизм определения утечек памяти. Для его включения, достаточно в файле проекта добавить строчку:

program Project1;

uses
  System.StartUpCopy,
  FMX.Forms,
  Unit3 in 'Unit3.pas' {Form3};

{$R *.res}

begin
  ReportMemoryLeaksOnShutdown := True; // Включение отчета утечек памяти при закрытии приложения.

  Application.Initialize;
  Application.CreateForm(TForm3, Form3);
  Application.Run;
end.

В вашем случае объекты удаляться только на Windows и OSX. На Android и iOS - нет. Ответы почему уже были даны в следующих темах:

  1. Освобождение динамического массива. Delphi XE7
  2. Пользоваться Free или DisposeOf?
  3. Как правильно удалять контролы в RunTime?
Ссылка на комментарий
  • 0

Большое спасибо за ответ, а также ссылки на информацию по вопросу.

Правильно ли я понимаю, что в Android, кроме использования метода free с удаляемым объектом, нужно обнулить все ссылки на него, чтобы полностью освободить занимаемую им память?

То есть помимо того, что в моем коде, нужно поудалять ссылки на удаляемые объекты?
 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...