Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2016, 11:36   #1
Des80
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 21
По умолчанию нужно ли освобождать память в деструкторе?

допустим у меня есть класс, в котором есть поле типа L:TList. В констукторе этого класса я создаю его L:=TList.Create;
вопрос: нужно ли освобождать память в деструкторе L.free или это происходит автоматически?
Des80 вне форума Ответить с цитированием
Старый 06.09.2016, 11:40   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
или это происходит автоматически?
НЕТ
Цитата:
нужно ли освобождать память в деструкторе L.free
ДА
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 06.09.2016, 11:40   #3
netpolice
Форумчанин
 
Аватар для netpolice
 
Регистрация: 14.02.2013
Сообщений: 222
По умолчанию

Цитата:
Сообщение от Des80 Посмотреть сообщение
допустим у меня есть класс, в котором есть поле типа L:TList. В констукторе этого класса я создаю его L:=TList.Create;
вопрос: нужно ли освобождать память в деструкторе L.free или это происходит автоматически?
Лучше всего освобождать... Иначе могут появляться непонятные ситуации с распределением памяти... Да и грамотность свою покажите.
netpolice вне форума Ответить с цитированием
Старый 06.09.2016, 11:50   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Что в них непонятного? Просто не освободится память.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 06.09.2016, 11:54   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Лучше всего освобождать
Не лучше, а обязательно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.09.2016, 11:55   #6
Des80
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 21
По умолчанию

ок, тогда еще один вопрос. Например у меня есть список TList, я хочу добавить в этот список указатели на рекорды
TMyrecord=record
x:integer;
y:integer;
end;

PMyRecord=^TMyRecord;

я делаю это следующим образом




procedure Myproc;
var
P:PMyRecord;
L:TList;
begin
L:=TList.Create;
New(P);
P.x:=5;
P.y:=10;
L.add(P);
end;


При удалении списка L достаточно ли мне просто сделать L.clear или
надо пробежаться по всем записям и сделать dispose?

for i:= 0 to List.count-1 do
Dispose(PMyRecord(L[i]));
Des80 вне форума Ответить с цитированием
Старый 06.09.2016, 12:05   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

пробежаться по всем записям. List на автомате не освобождает
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.09.2016, 12:11   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Запомните кто намусорил, тот и убирает.
А ещё лучше, где намусорил там и убираешь.

Так что Dispose вам надо делать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 06.09.2016, 12:41   #9
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от Des80 Посмотреть сообщение
ок, тогда еще один вопрос. Например у меня есть список TList, я хочу добавить в этот список указатели на рекорды
Если по логике список является владеющим, правильней всего будет унаследоваться от TList и перекрыть у него защищенный метод Notify:
Код:
type
  TMyRecordList = class(TList)
  protected
    procedure Notify(Ptr: Pointer; Action: TListNotification); override;
  end;

procedure TMyRecordList.Notify(Ptr: Pointer; Action: TListNotification);
begin
  if Action = lnDeleted then
    Dispose(PMyRecord(Ptr));
end;
Vapaamies вне форума Ответить с цитированием
Старый 06.09.2016, 13:18   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А TObjectList может и сам освобождать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
с++ проблемма в деструкторе proef Помощь студентам 2 23.10.2013 13:19
Как лучше всего освобождать созданные в потоке объекты? TwiX Общие вопросы Delphi 2 13.03.2010 21:27
Освобождать динамические процедуры. Alex Cones Общие вопросы Delphi 4 28.01.2010 17:30
Нужно ли очишать память ... mrandrey Общие вопросы Delphi 2 15.06.2007 20:51