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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2014, 20:22   #1
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию Борьба с утечками памяти временных компонентов.

Привет всем. Подскажите пожалуйста. Имеется некий код, в котором Я присваиваю временному контролу участок памяти контрола на форме. Вопрос. Нужно ли уничтожать контрол по окончании работы, или это ни чего не даст?

Код:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  ListBox: TListBox;
begin
  ListBox := (Control as TListbox); // Присвоили временному ListBox участок памяти Listbox1 
  ...
  ListBox := nil;
  ListBox.Free; // Есть ли смысл в таком уничтожении?
XE5 вне форума Ответить с цитированием
Старый 10.03.2014, 20:28   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Нужно если он не нужен.
Кстати:
Код:
  ListBox.Free;
  ListBox := nil;
Иначе AV

P.S. Не понял зачем в локальной процедуре VCL контрол создавать... Может имелось ввиду TStringList?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.03.2014, 20:28   #3
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Код:
 ListBox := nil;
  ListBox.Free; // Есть ли смысл в таком уничтожении?
в таком - нет.

Код:
 
  ListBox.Free;
  ListBox := nil;
в таком - есть
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 10.03.2014, 20:35   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В той процедуре, что вы показали не нужно. За переданный Control отвечает вызывающий код и он должен заниматься удалением. А ListBox := (Control as TListbox); ничего не создает, а просто указатель на контрол помещает в другую переменную
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.03.2014, 20:37   #5
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
P.S. Не понял зачем в локальной процедуре VCL контрол создавать...
А он и не создаётся. Или Вы где-то увидели Create? Это нужно для того, чтоб во всех участках кода внутри процедуры не писать конструкцию.
Код:
(Control as TListbox)
Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Код:
 
  ListBox.Free;
  ListBox := nil;
в таком - есть
Присваиваем ListBox участок памяти ListBox1 и делаем ListBox.Free. Уничтожается участок памяти визуального ListBox1. Дальше объяснять что произойдёт?
XE5 вне форума Ответить с цитированием
Старый 10.03.2014, 20:38   #6
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
В той процедуре, что вы показали не нужно.
Утечки не будет?
XE5 вне форума Ответить с цитированием
Старый 10.03.2014, 20:41   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от XE5 Посмотреть сообщение
Утечки не будет?
100% не будет. Если внешний код позаботится об этом
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.03.2014, 20:42   #8
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Будет
Цитата:
Project Project1.exe raised exception class EInvalidOperation with message 'Control '' has no parent window'.
Лучше так, чтобы ошибочные мысли не возникали
Код:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
//  with TListBox(Control) do
  with (Control as TListbox) do
  begin
    Caption := 'Index: ' + IntToStr(Index); // чтобы видеть, что есть реакция. <- тут ваш код
  end;
end;
Alter вне форума Ответить с цитированием
Старый 10.03.2014, 20:44   #9
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Если внешний код позаботится об этом
Поподробнее пожалуйста, что нужно делать во внешнем коде?
Цитата:
Сообщение от Alter Посмотреть сообщение
Лучше так, чтобы ошибочные мысли не возникали
Толковая мысль. Благодарю.

P.S. Alter подсказал правильно решение, вопрос закрыт.

Последний раз редактировалось XE5; 10.03.2014 в 20:51.
XE5 вне форума Ответить с цитированием
Старый 10.03.2014, 20:53   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Alter
О чем речь вообще? А, не использовать переменную. В принципе это тоже самое
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шумоподавление во временных рядах yaapelsinko Свободное общение 3 19.06.2012 20:41
прогнозирование временных рядов Tanyyyy C# (си шарп) 0 24.05.2012 17:19
Шаблон в шаблоне или борьба с выделением памяти t2skler Общие вопросы C/C++ 6 30.04.2012 16:59
Удаление временных объектов Kn793 Общие вопросы C/C++ 4 10.06.2010 23:22
Как бороться с утечками в dll-ках ZuBy Общие вопросы Delphi 1 05.01.2010 00:26