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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2020, 14:12   #1
remus-xe2
Пользователь
 
Регистрация: 27.10.2017
Сообщений: 54
По умолчанию как освободить переменную

Заношу данные в массив JSON.
Если не освобождать переменную Obj то все работает, но это же утечка памяти?
утечки смотрю через ReportMemoryLeaksOnShutdown := true ;

Код:
    for i := 0 to MainForm.ClientList.Items.Count - 1 do
   
        if (URL <> '') and (GetAdd(ClientList.Items.Item[i].Caption)) then
        begin
          try
          Obj := TJSONObject.Create;
          Obj .AddPair('test', TJSONString.Create('test'));
          QueryList.AddElement(Obj );
          finally
           FreeAndNil(Obj );
          end;
        end
        else
          continue;
      end;
QueryList - глобальная переменная.

Последний раз редактировалось remus-xe2; 23.06.2020 в 14:15.
remus-xe2 вне форума Ответить с цитированием
Старый 23.06.2020, 14:44   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

освобождать (удалять) объекты надо на там где их создали,
а там где необходимость в оном заканчивается.
Цитата:
Если не освобождать переменную Obj то все работает
в данном случае при закрытии QueryList.
когда QueryList перестанет нуждаться в этих данных.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 24.06.2020, 03:02   #3
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Ну и да. Блок try..finally тут совсем не нужен.
northener вне форума Ответить с цитированием
Старый 24.06.2020, 13:49   #4
remus-xe2
Пользователь
 
Регистрация: 27.10.2017
Сообщений: 54
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
освобождать (удалять) объекты надо на там где их создали,
а там где необходимость в оном заканчивается.

в данном случае при закрытии QueryList.
когда QueryList перестанет нуждаться в этих данных.
То есть, в моем случае, можно сделать эту переменную так же глобальной и уничтожить ее в дестрое формы там же где и уничтожается QueryList ?
remus-xe2 вне форума Ответить с цитированием
Старый 24.06.2020, 13:50   #5
remus-xe2
Пользователь
 
Регистрация: 27.10.2017
Сообщений: 54
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Ну и да. Блок try..finally тут совсем не нужен.
почему? Из-за того что исключение в этом коде исключено ?)
remus-xe2 вне форума Ответить с цитированием
Старый 24.06.2020, 18:36   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Потому что уничтожать в этом коде не нужно.
northener вне форума Ответить с цитированием
Старый 25.06.2020, 16:09   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

переменная <> объект

https://programmersforum.ru/showpost...0&postcount=10

память занимают объекты
память для объектов выделяется в их конструкторах.
Код:
xxx:=TMyObject.Create; //создать объект типа TMyObject(выделить ему память) и записать ссылку на него(на только что созданный объект) в переменную xxx/
в переменных хранятся ССЫЛКИ на объекты
на один и тот же объект может существовать любое число ссылок (записан во множество "переменных" )
Код:
zzz:=xxx; // скопировать ссылку имеющуюся в одной переменной(xxx) в другую (zzz)
Код:
xxx.Free; //означает удалить(Free) объект ссылка на который имеется в переменной xxx.
освободить память(удалить объект) можнонеобходимо РОВНО один раз.
Код:
xxx.Free;
zzz.Free;
Цитата:
Код:
 QueryList.AddElement(Obj );
копирование ссылки из одной переменной(Obj) куда-то внутрь другого объекта(QueryList).
как правило оттуда ее можно бывает и достать.
таким образом не будет необходимости в глобальности переменной Obj.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 25.06.2020 в 16:14.
evg_m вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
освободить порт 80 SAMOUCHKA Windows 4 27.12.2017 10:41
Как в DLL освободить переменную объектного типа, не закрывая объект? Урсула Общие вопросы Delphi 5 07.04.2017 16:33
Описать процедуру Minmax(X, Y), записывает в переменную X минимальное из значений X и Y, а в переменную Y - максимальное kinash96 Помощь студентам 3 12.10.2013 19:49
label динамически освободить grafgrial Общие вопросы Delphi 5 07.09.2011 07:59
освободить СОМ порт varelik Общие вопросы Delphi 11 11.02.2010 21:49