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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2020, 13:08   #1
munhauz
Пользователь
 
Регистрация: 07.10.2010
Сообщений: 47
По умолчанию проблема памяти

Дорогие формучани, я понимаю то вопрос глупый и все же
есть условная функция
Код:
function structurdata(stlf, stld: TStringList; daton: TDate): TStringList;
 var
   stl:TStringList
 begin
   stl := TStringList.Create;
   stl:=stlf+stlf;
   result :=stl
 end;
все хорошо все делается но, скажем если функцию начинать вызывать бесконечное количество раз то память ПК начинает таять на глазах, и в какой то момент программа выдает ошибку нехватки памяти ... и все каюк,
добавление после строки присвоение данных результату
Код:
   result :=stl
   FreeAndNil(stl);
возвращает пустоту место данных.
так вот вопрос что не так я делаю? или как очистить переменную?

Последний раз редактировалось munhauz; 25.09.2020 в 13:11.
munhauz вне форума Ответить с цитированием
Старый 25.09.2020, 13:41   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,218
По умолчанию

Объект возращается функцией по ссылке, потому удалять этот объект внутри функции будет некорректно. Корректно будет удалить объект в точки вызова после того, когда он станет не нужен.
Arigato вне форума Ответить с цитированием
Старый 25.09.2020, 13:55   #3
munhauz
Пользователь
 
Регистрация: 07.10.2010
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Объект возращается функцией по ссылке, потому удалять этот объект внутри функции будет некорректно. Корректно будет удалить объект в точки вызова после того, когда он станет не нужен.
верно я понял
1 есть процедура внутри которй я обращаюсь к данной функуии
скажем
Код:
procedure Tfrm_main.Timer1Timer(Sender: TObject);
var 
 stl,stlf, stld: TStringList;
  daton: TDate;
begin
 stlf := TStringList.Create;
 stld := TStringList.Create;
 stl := TStringList.Create;
 stlf.LoadFromFile(dirini + '\stlf.txt');
 stld.LoadFromFile(dirini + '\stld.txt');
 stl:=structurdata(stlf, stld,now);
 sst.SaveToFile(dirini + '\stl.txt'); 
 FreeAndNil(stl);
 FreeAndNil(stlf);
 FreeAndNil(stld);
end;
2. при написании
Код:
 FreeAndNil(stl);
у меня и в функции должна обнулиться переменная ?
или я что-то не понимаю?

просо написано вроде так, но обнуления нет.. память занимаеться , каждый раз при создании в функции переменной прога отбираеть кусок пямяти под нее , но потом память не чиститься.
munhauz вне форума Ответить с цитированием
Старый 25.09.2020, 14:23   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

https://programmersforum.ru/showthre...10#post1775810
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 26.09.2020, 18:01   #5
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,218
По умолчанию

munhauz, у вас дважды делается stl := TStringList.Create;
Оставьте или в вызываемой процедуре, или в вызывающей. Раз освобождается память в вызывающей, то логично и создание объекта делать там.
Arigato вне форума Ответить с цитированием
Старый 30.09.2020, 09:40   #6
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

ну и запутано же вы объясняете....Капец....... Будьте проще.

Цитата:
Сообщение от munhauz Посмотреть сообщение
так вот вопрос что не так я делаю?
надо так
Код:


function structurdata(stlf, stld: TStringList; daton: TDate): TStringList;
 var
   stl:TStringList;
 begin
   stl := TStringList.Create;
   stl.Append(stlf); //кстати, зачем это?
   result :=stl;
 end;



sl := structurdata(...);
...что-то делаем...
sl.Free; //грубо говоря, это освободит память, занятую в функции structurdata
вот и всё

Последний раз редактировалось BLACK_RAIN; 30.09.2020 в 09:47.
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.09.2020, 10:29   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
надо так
а может так

РЕКОМЕНДУЕТСЯ выделение и освобождение памяти делать на одном уровне.( в одной процедуре, одном объекте)
таким образом при написании (и отладке)легче отследить потери.
Код:
functionprocedure structdata(sllf, stld: TStrings; datton: TDate); // используем базовый класс TStrings ЧТОБЫ...
// процедура могла работать с РАЗНЫМИ наследниками (TStringList/ Мемо.Lines/ ComboBox.Items/ ListBox.Items/ ...
begin
  stl:=TStringList.Create;
  stl.Append(stlf);
  result:=stl;
end;

sl:=TStringList.Create;
structdata(..., sl, ...);
... // что-то делаем
sl.Free;
P.S. зачем теперь нужна процедура из одного оператора и неиспользуемого параметра?
видимо остальное было убрано с целью минимизации примера.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 30.09.2020 в 10:33.
evg_m вне форума Ответить с цитированием
Старый 30.09.2020, 13:23   #8
munhauz
Пользователь
 
Регистрация: 07.10.2010
Сообщений: 47
По умолчанию

Комрады, вы не в ту степь ушли
пофигу что делается в 2 листами внутри процедуры
важно следующее:
есть 2 листа с которыми нужно сделать работу, результатом которой служит 3 лист
и данные этого 3 листа нужно вернуть.
но проблема в том что если скажем эту функцию вызвать 10 000 раз то она скушает много памяти.
использовать глобальную переменную не выход
и как эту память почистить я не знаю
munhauz вне форума Ответить с цитированием
Старый 30.09.2020, 13:44   #9
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,218
По умолчанию

Цитата:
Сообщение от munhauz Посмотреть сообщение
и как эту память почистить я не знаю
Вам уже ответили.
Arigato вне форума Ответить с цитированием
Старый 30.09.2020, 13:53   #10
munhauz
Пользователь
 
Регистрация: 07.10.2010
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Вам уже ответили.
не работает что ответили

Код:
procedure Tfrm_main.Button1Click(Sender: TObject);
var
  stl, stl2: TStringList;
  i, c: integer;
begin
  c := 0;
  if Button1.Tag = 0 then
    Button1.Tag := 1
  else
    Button1.Tag := 0;
 
 while Button1.Tag = 1 do
    begin
      stl := TStringList.Create;
      stl.LoadFromFile(dirini + '\sst.txt'); // любой текстовый файл
      for i := 0 to stl.Count - 1 do
        begin
          // stl2.Add(stl[i]);
          stl2 := strtostldis(stl[i], '|');
        end;
      FreeAndNil(stl);
      FreeAndNil(stl2);
      inc(c);
      l_topdat.Caption := IntToStr(c);
      Application.ProcessMessages;
    end;

end;
сама функция
Код:
function strtostldis(str: string; dis: Char): TStringList;
var
  stl: TStringList;
begin
  stl := TStringList.Create;
  stl.Delimiter := dis;
  stl.StrictDelimiter := true;
  stl.DelimitedText := str;
  Result := stl;
end;
на 200 тысячной операции съедает всю память


текст типа


Цитата:
[text]|18500||||||||17000|1500||||||0|0|| ||0||||||
|01.06.2020 - 07.06.2020|0|TOP преподаватели||||||400/571|500/1040|500/732|500/587|||||0,36|0,36||||0,36|32|||||
|||21.05.2018 16:31:05||||||||||||||0|0||||0||||| |
|||||||||||||||||0|0||||0|Не выполнил|||||
|08.06.2020 - 14.06.2020|0|TOP преподаватели||||||400/571|500/1040|500/732|500/587|||||0,36|0,36||||0,36|32|||||
|||21.05.2018 16:31:05||||||||||||||0|0||||0||||| |
|||||||||||||||||0|0||||0|Не выполнил|||||
|15.06.2020 - 21.06.2020|7000|TOP преподаватели||||||400/571|500/1040|500/732|500/587|||||0,36|0,36||||0,36|32|||||
|||21.05.2018 16:31:05|||||||14|||||||0|0||||0||| |||
||||||||||7000|||||||0|0||||0|Не выполнил|||||
|22.06.2020 - 28.06.2020|2000|TOP преподаватели||||||400/571|500/1040|500/732|500/587|||0|0|0,36|0,36||||0,36|32|||||
|||21.05.2018 16:31:05|||||||4|||||||0|0||||0|||| ||
||||||||||2000|||||||0|0||||0|Не выполнил|||||
|29.06.2020 - 05.07.2020|9500|TOP преподаватели||||||400/571|500/1040|500/732|500/587|||0|0|0,36|0,36||||0,36|32|||||
|||21.05.2018 16:31:05|||||||16|3||||||0|0||||0|| ||||
||||||||||8000|1500||||||0|0||||0|Н е выполнил|||||
|06.07.2020 - 12.07.2020|0|TOP преподаватели||||||||||||||||||||32 |||||
|||21.05.2018 16:31:05|||||||18|2|1|||||||||||||| ||
|||||||||||||||||||||||Не выполнил|||||
[текст]|0|||||||||||||||0|0||||0||||||
|01.06.2020 - 07.06.2020|0|Обычные преподаватели||||||400|400/550|400|400|||||0,35|0,35||||0,35|| ||||
|||21.05.2018 16:31:05||||||||||||||0|0||||0||||| |
|||||||||||||||||0|0||||0||||||
|08.06.2020 - 14.06.2020|0|Обычные преподаватели||||||400|400/550|400|400|||||0,35|0,35||||0,35|| ||||
|||21.05.2018 16:31:05||||||||||||||0|0||||0||||| |
|||||||||||||||||0|0||||0||||||
|15.06.2020 - 21.06.2020|0|Обычные преподаватели||||||400|400/550|400|400|||||0,35|0,35||||0,35|| ||||
|||21.05.2018 16:31:05||||||||||||||0|0||||0||||| |
|||||||||||||||||0|0||||0||||||
|22.06.2020 - 28.06.2020|0|Обычные преподаватели||||||400|400/550|400|400|||0|0|0,35|0,35||||0,35 ||||||
|||21.05.2018 16:31:05||||||||||||||0|0||||0||||| |
|||||||||||||||||0|0||||0||||||
|29.06.2020 - 05.07.2020|0|Обычные преподаватели||||||400|400/550|400|400|||0|0|0,35|0,35||||0,35 ||||||
|||21.05.2018 16:31:05||||||||||||||0|0||||0||||| |
|||||||||||||||||0|0||||0||||||
|06.07.2020 - 12.07.2020|0|Обычные преподаватели|||||||||||||||||||||| |||
|||21.05.2018 16:31:05|||||||||||||||||||||||||
||||||||||||||||||||||||||||
munhauz вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с выделением памяти (Си) _BYTE Помощь студентам 0 19.04.2014 16:22
Проблема с утечкой памяти mr_cipher C# (си шарп) 10 28.08.2012 14:18
Проблема с переполнением памяти maxeebon Общие вопросы Delphi 4 19.08.2011 22:09
Проблема с освобождением памяти Vyachek2010 Общие вопросы Delphi 15 08.02.2011 17:05
Проблема с виделением памяти! FreTFuL Общие вопросы C/C++ 1 07.05.2010 20:23