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

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

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

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

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

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

Доброго дня, есть код
Код:
Procedure SaveListTg;
var
  i: Integer;

  obj: TJSONObject;
  arr: TJSONArray;

  js: TStringList;
begin
  try
    arr:=TJSONArray.Create as TJSONArray;
    for I := 0 to tgBotForm.ListView1.Items.Count-1 do
        begin
          obj:=TJSONObject.Create as TJSONObject;
          obj.AddPair('user_id',  tgBotForm.ListView1.Items.Item[i].Caption);
          obj.AddPair('user_name', EncodeString( tgBotForm.ListView1.Items.Item[i].SubItems.Strings[0]));
          obj.AddPair('hash', EncodeString( tgBotForm.ListView1.Items.Item[i].SubItems.Strings[1]));
          obj.AddPair( 'auth', TJSONBool.Create( tgBotForm.ListView1.Items.Item[i].Checked));
          arr.AddElement(obj);
        end;
     try
       js:=TStringList.Create;
       js.Text:=arr.ToString;
       js.SaveToFile(ExtractFilePath(Application.ExeName)+'teleg_acc.json');
     finally
        js.Free;
     end;
  finally
   obj.Free;
  end;
end;
в котором течет память, проверяю через ReportMemoryLeaksOnShutdown := true.

Не пойму, как освободить переменные arr и obj? По моей логике должно это быть так
Код:
Procedure SaveListTg;
var
  i: Integer;

  obj: TJSONObject;
  arr: TJSONArray;

  js: TStringList;
begin

    arr:=TJSONArray.Create as TJSONArray;
    for I := 0 to tgBotForm.ListView1.Items.Count-1 do
        begin
          try
          obj:=TJSONObject.Create as TJSONObject;
          obj.AddPair('user_id',  tgBotForm.ListView1.Items.Item[i].Caption);
          obj.AddPair('user_name', EncodeString( tgBotForm.ListView1.Items.Item[i].SubItems.Strings[0]));
          obj.AddPair('hash', EncodeString( tgBotForm.ListView1.Items.Item[i].SubItems.Strings[1]));
          obj.AddPair( 'auth', TJSONBool.Create( tgBotForm.ListView1.Items.Item[i].Checked));
          arr.AddElement(obj);
  finally
         obj.Free;
         end;          
        end;
     try
       js:=TStringList.Create;
       js.Text:=arr.ToString;
       js.SaveToFile(ExtractFilePath(Application.ExeName)+'teleg_acc.json');
     finally
        arr.free;
        js.Free;
     end;

end;
но разумеется программа крашится в таком исполнении...
remus-xe2 вне форума Ответить с цитированием
Старый 14.10.2020, 19:43   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Каждый созданный obj заносится в arr методом AddElement(obj). Следовательно освобождать все ранее созданные obj надо перед освобождением самого arr. Для этого нужно пройтись циклом по всем элементам в arr, то есть получить обратно ссылки на все созданные obj.
Arigato вне форума Ответить с цитированием
Старый 14.10.2020, 19:45   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

https://www.programmersforum.ru/show...13&postcount=2

obj.Free;
можно только после окончания использования arr.
и надо освобождать все(каждый) созданный объект.
а уж как вспомнить все "ранее" созданные объекты...
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 14.10.2020, 21:45   #4
remus-xe2
Пользователь
 
Регистрация: 27.10.2017
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Для этого нужно пройтись циклом по всем элементам в arr, то есть получить обратно ссылки на все созданные obj.
Можно образец в коде ?)
Я что то не так понял походу...
Код:
       for I := 0 to arr.Count-1 do
          arr.Items[I].Free;
remus-xe2 вне форума Ответить с цитированием
Старый 14.10.2020, 21:47   #5
remus-xe2
Пользователь
 
Регистрация: 27.10.2017
Сообщений: 54
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
obj.Free;
можно только после окончания использования arr.
ага. Тогда первый вариант у меня все же верен?
remus-xe2 вне форума Ответить с цитированием
Старый 14.10.2020, 22:18   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

нет.
obj.Free;
удаляется память ОДНОГО (cозданного последним)obj.

Цитата:
и надо освобождать все(каждый) созданный объект.
а уж как вспомнить все "ранее" созданные объекты...
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 14.10.2020, 22:28   #7
remus-xe2
Пользователь
 
Регистрация: 27.10.2017
Сообщений: 54
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
нет.
obj.Free;
удаляется память ОДНОГО (cозданного последним)obj.
Да, с obj.Free; понял, убрал.
Вариант с
Код:
       for I := 0 to arr.Count-1 do
          arr.Items[I].Free;
возможно глупо выглядит но утечек стало меньше..

как их вычистить ?...

Последний раз редактировалось remus-xe2; 14.10.2020 в 22:31.
remus-xe2 вне форума Ответить с цитированием
Старый 14.10.2020, 22:37   #8
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Сам arr после тоже надо освободить.
Arigato вне форума Ответить с цитированием
Старый 14.10.2020, 22:43   #9
remus-xe2
Пользователь
 
Регистрация: 27.10.2017
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Сам arr после тоже надо освободить.
я пытался.. но крашится программа...
remus-xe2 вне форума Ответить с цитированием
Старый 14.10.2020, 22:46   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию

Тогда попробуйте создать массив obj[0..9]. Сначала освобождайте arr, а затем все элементы из массива obj.
Arigato вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
От куда оператор delete берет размер массива, чтобы освободить всю память, которая была выделена под массив? Arigato Общие вопросы C/C++ 42 10.06.2019 18:14
Как освободить память от типа Audio? reyn90 Общие вопросы .NET 6 26.12.2015 23:21
Освободить память после потока SPLER Общие вопросы Delphi 7 06.06.2014 02:08
Освободить память формы st_yak C++ Builder 0 21.12.2013 19:56
Освободить память от CEdit Eros Общие вопросы C/C++ 0 29.11.2010 15:37