Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получим ли мы утечки памяти, если... / 15 сообщений из 15, страница 1 из 1
30.07.2018, 11:27
    #39680937
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получим ли мы утечки памяти, если...
Привет!

Если при создании формы мы присвоим результат переменной типа TForm то получим ли мы утечки памяти?
Т.е. мы имеем форму типа
Код: pascal
1.
2.
3.
4.
5.
6.
TMyForm = class(TForm)
  ...
  ...
  ...
  constructor MyConstructor(AOwner: TComponent);
end;



Создаем ее и убиваем так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var
  frm: TForm;
begin
  TMyForm.MyConstructor(Self);
  try
    ...
    ...
    ...
  finally
    frm.Free;
  end;
end;



Получим мы тут утечку?
...
Рейтинг: 0 / 0
30.07.2018, 11:44
    #39680948
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получим ли мы утечки памяти, если...
SQL-TalkerПолучим мы тут утечку?
Где присвоение?
...
Рейтинг: 0 / 0
30.07.2018, 11:50
    #39680955
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получим ли мы утечки памяти, если...
Пардон:

Код: pascal
1.
2.
3.
begin
   frm := TMyForm.MyConstructor(Self);
   ...
...
Рейтинг: 0 / 0
30.07.2018, 11:52
    #39680957
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получим ли мы утечки памяти, если...
SQL-TalkerПардон:
Так не получим, если Free в TMyForm каким-то случайным образом не перекрыт.
...
Рейтинг: 0 / 0
30.07.2018, 11:59
    #39680962
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получим ли мы утечки памяти, если...
wadman,

Т.е. на этой форме лежит куча разных компонент (форма для редактирования данных из БД) и не смотря на то, что по факту делается Free для переменной с типом не самой формы, а ее родителя ( TForm ), все равно все корректно удалится и память будет освобождена?
...
Рейтинг: 0 / 0
30.07.2018, 12:01
    #39680963
527470
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получим ли мы утечки памяти, если...
SQL-Talker,

Да, деструкторы в Delphi виртуальные и если написаны правильно, то всё отработает.
...
Рейтинг: 0 / 0
30.07.2018, 12:36
    #39680989
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получим ли мы утечки памяти, если...
SQL-Talker,

удалять компоненты будет даже не деструктор родителя родителя (TCustomForm.Destroy), а где-то ещё глубже

TComponent.Destroy и TWinControl.Destroy ЕМНИП
...
Рейтинг: 0 / 0
30.07.2018, 13:05
    #39681013
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получим ли мы утечки памяти, если...
Ок, отлично. Спасибо большое!
...
Рейтинг: 0 / 0
30.07.2018, 13:19
    #39681024
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получим ли мы утечки памяти, если...
SQL-Talkerwadman,

Т.е. на этой форме лежит куча разных компонент (форма для редактирования данных из БД) и не смотря на то, что по факту делается Free для переменной с типом не самой формы, а ее родителя ( TForm ), все равно все корректно удалится и память будет освобождена?

По факту Free делается ну у родителя а как раз у твоей формы, родитель вызывается позже с помощью inherited. Отладчиком смотрится без каких-либо проблем как что разрушается.
...
Рейтинг: 0 / 0
30.07.2018, 13:24
    #39681036
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получим ли мы утечки памяти, если...
SQL-Talker,

Главное, если вы перекрываете в своей форме деструктор, то он должен быть оформлен как
Код: pascal
1.
destructor Destory; override;

и в самом деструкторе необходимо вызвать inherited ;
...
Рейтинг: 0 / 0
30.07.2018, 13:38
    #39681050
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получим ли мы утечки памяти, если...
Ariochудалять компоненты будет даже не деструктор родителя родителя (TCustomForm.Destroy), а где-то ещё глубже

TComponent.Destroy и TWinControl.Destroy ЕМНИП
и для TObject.
Вот если родитель старше TObject - тогда да ;)
...
Рейтинг: 0 / 0
30.07.2018, 18:00
    #39681242
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получим ли мы утечки памяти, если...
у TObject нет свойств .Compontents[i] и .Controls[i]
...
Рейтинг: 0 / 0
31.07.2018, 14:16
    #39681572
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получим ли мы утечки памяти, если...
Ariochу TObject нет свойств .Compontents[i] и .Controls[i]а деструктор есть.
...
Рейтинг: 0 / 0
31.07.2018, 15:35
    #39681623
Guest2013
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получим ли мы утечки памяти, если...
SQL-Talker,

для конструкций вида:
Код: pascal
1.
2.
3.
4.
5.
6.
MyForm := TMyForm.Create(Self);
try
{...}
finally
  MyForm.Free;
end;


предполагается остановка основного потока приложения в этом месте, (т.е. только MyForm.ShowModal ) до закрытия этой формы;
для нескольких окон можно использовать ивент самой формы метод OnClose и прописать в нем:
Код: pascal
1.
2.
3.
4.
begin
  {...}
  Action := caFree;
end;


Тогда нет необходимости самому уничтожать окно ( MyForm.Free ), оно само будет уничтожено по закрытии.
...
Рейтинг: 0 / 0
01.08.2018, 18:26
    #39682191
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получим ли мы утечки памяти, если...
YuRockAriochу TObject нет свойств .Compontents[i] и .Controls[i]а деструктор есть.

....но он не может удалять компоненты, потому что в TObject их нет
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получим ли мы утечки памяти, если... / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]