[РЕШЕНО] Освободжение памяти?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

[РЕШЕНО] Освободжение памяти?

Сообщение Sash0k » 19.07.2011 13:22:17

Здравствуйте!
Пытаюсь вновь писать на паскале, но после дотнета в голове каша :)

Вопрос:

Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
var
  cb : TComboBox;
  i : byte;         
begin
  cb:= FindComponent('CB'+ IntToStr(i)) as TComboBox;
  cb.ItemIndex:= StrToInt(SettingsList[i-1]);

  // работа...

  cb := nil;
  cb.Free;
end;


Нужно ли выполнять
cb := nil;
cb.Free;

в конце метода, или объект будет выгружен автоматически?
Последний раз редактировалось Sash0k 19.07.2011 14:03:17, всего редактировалось 1 раз.
Sash0k
новенький
 
Сообщения: 43
Зарегистрирован: 19.01.2009 11:39:27
Откуда: Вятка - Киров

Re: Освободжение памяти?

Сообщение Vadim » 19.07.2011 13:38:53

Sash0k писал(а):Нужно ли выполнять
cb := nil;
cb.Free;
в конце метода, или объект будет выгружен автоматически?

Только в обратном порядке. ;) И только в том случае, если Вы хотите непременно загубить тот компонент, ссылку на который берёте с помощью FindComponent(). Вот если бы Вы создавали этот компонент заново (cb:=TComboBox.Create()), тогда делать cb.Free нужно в обязательном порядке, а то в программе будет болтаться выделенный, но недоступный кусок памяти.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Освободжение памяти?

Сообщение Sash0k » 19.07.2011 13:55:01

Губить его ненужно разумеется.
Первой командой cb := nil; как раз убираю ссылку на реальный объект. А при помощи Free уже хочу чистить память.

То есть переменные типа T<SomeObject> можно рассматривать как и простейшие, типа integer, string. Так как моя cb : TComboBox; объявлена локально в процедуре, то по завершению процедуры память будет освобождена автоматически.
Верно?
Sash0k
новенький
 
Сообщения: 43
Зарегистрирован: 19.01.2009 11:39:27
Откуда: Вятка - Киров

Re: Освободжение памяти?

Сообщение Mr.Smart » 19.07.2011 13:57:51

Вы для cb память не выделяете! Вы в неё помешаете ссылку на существующий объект т.ч. в данном случае обнулять и освобождать ничего не нужно.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

[РЕШЕНО] Освободжение памяти?

Сообщение Sash0k » 19.07.2011 14:02:45

Всё, спасибо. Тема закрыта :)
// Только тогда кажется странным, что вызов cb.Free не дает никаких исключений. Неоднозначное поведение...
Sash0k
новенький
 
Сообщения: 43
Зарегистрирован: 19.01.2009 11:39:27
Откуда: Вятка - Киров

Re: [РЕШЕНО] Освободжение памяти?

Сообщение Brainenjii » 19.07.2011 14:37:21

Free как раз и проверяет - не nil ли Вы пытаетесь освободить (objpas.inc):
Код: Выделить всё
      procedure TObject.Free;
        begin
           // the call via self avoids a warning
           if self<>nil then
             self.destroy;
        end;

Немножко не в тему - я, например, всегда вызываю Destroy вместо Free, хотя недавно прочёл, дескать, в Delphi предпочтительней использовать Free, да и вообще, все деструкторы надо перекрывать Override'ом 0.о Так ли это, или информация неактуальна?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: [РЕШЕНО] Освободжение памяти?

Сообщение vada » 19.07.2011 14:41:43

Вполне себе однозначное.
Как уже писали что если бы вы создали объект cb:=TComboBox.Create(), а потом cb:=nil; cb.Free; то объект не грохнется а останется в памяти.
У вас же немного другая ситуация кторую можно описать для наглядности примерно так:
combobox:=TComboBox.Create();
cb := combobox;
....
cb:=nil; {при этом combobox<>nil вот тут и отличие от C#}
и дальше совершенно бесполезный оператор
cb.Free; {ибо cb уже равен nil и никуда не ссылается}
объект combobox останется живой и невредимый и доступ к нему останется.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: [РЕШЕНО] Освободжение памяти?

Сообщение Mr.Smart » 19.07.2011 14:45:08

Можно вызывать Destroy на прямую, но вы сами сказали, что Free делает.
Насчёт override. Суть в том что необходимо освободить память во всех предках.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: [РЕШЕНО] Освободжение памяти?

Сообщение hinst » 19.07.2011 22:40:33

Brainenjii, documentation tells us always use .free
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: [РЕШЕНО] Освободжение памяти?

Сообщение Brainenjii » 19.07.2011 23:21:38

Никогда не пользую Free для своих объектов, с моими деструкторами Изображение Вообще, слабо в голове укладывается ситуация, когда пытаются освободить nil Изображение Это же явная ошибка, и хорошо, если она всплывёт при первом же запуске
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 222

Рейтинг@Mail.ru
cron