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

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - 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