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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2018, 00:28   #1
Алексей0001
Пользователь
 
Регистрация: 25.11.2017
Сообщений: 39
По умолчанию Утечка памяти

Подскажите где утечка
1.PNG
Код:
procedure TForm2.Button_OpenClick(Sender: TObject);
var
  pl, tl: TStringList;
  i: Integer;
  kname: string;
begin
  pl := TStringList.Create;
  if not OpenDialog1.Execute then
    exit;
  pl.LoadFromFile(OpenDialog1.FileName);
  // подготовил StringGrid1
  StringGrid1.FixedCols := 0;
  StringGrid1.FixedRows := 0;
  StringGrid1.RowCount := pl.Count;
  pl.Sort;
  // теперь разбить по строкам и столбцам разделенных символом ^
  tl := TStringList.Create;
  tl.Delimiter := #9;
  try
    for i := 0 to pl.Count - 1 do
    begin
      tl.Clear;
      tl.DelimitedText := pl.Strings[i];
      if StringGrid1.ColCount < tl.Count then
        StringGrid1.ColCount := tl.Count;
      StringGrid1.Rows[i].Assign(tl);
    end;
  finally
    FreeAndNil(tl);
    FreeAndNil(pl);
  end;

end;

procedure TForm2.Button_ProcessClick(Sender: TObject);
var
  ListFromFile, ListTemp, list: TStringList;
  i: Integer;
  fname: string;
begin
  ListFromFile := TStringList.Create;
  if not OpenDialog1.Execute then
    exit;
  ListFromFile.LoadFromFile(OpenDialog1.FileName);
  StringGrid1.FixedCols := 0;
  StringGrid1.FixedRows := 0;
  StringGrid1.RowCount := ListFromFile.Count;
  list := ListFromFile;
  fname := ChangeFileExt(OpenDialog1.FileName, '.result');
  // теперь разбить по строкам и столбцам разделенных символом ^
  ListTemp := TStringList.Create;
  ListTemp.Delimiter := #9;
  for i := 0 to ListFromFile.Count - 1 do
  begin
    ListTemp.Clear;
    ListTemp.DelimitedText := ListFromFile.Strings[i];
    if StringGrid1.ColCount < ListTemp.Count then
      StringGrid1.ColCount := ListTemp.Count;
    StringGrid1.Rows[i].Assign(ListTemp);
  end;
  try
    list.Sort;
    if not FileExists(fname) then // если нет файла, имя которого определено переменной fName
      ListFromFile.SaveToFile(fname) // тогда сохраняем в файл с именем fName
    else if (MessageBox(Handle, // иначе открывается диалоговое окно с предложение записть под другим именем
        'Обработанный файл с таким именем уже существует.'#13'Вы хотите сохранить файл под другим именем?', 'Запрос.', mb_YesNo or mb_IconQuestion) = idNo) or (not SaveDialog1.Execute) then
    begin
      ShowMessage('Операция отменена. Файл не сохранен!'); // в случаем не согласия сохранить файл с другим именем выводим сообщение на экран
      exit; // прерываем выполнение
    end
    else
      ListFromFile.SaveToFile(SaveDialog1.FileName);
    // иначе сохраняем файл с новым именем
    ShowMessage('Сохранение выполнено успешно!');
  finally
    FreeAndNil(ListFromFile);
    FreeAndNil(ListTemp);
  end;
end;

end.
Алексей0001 вне форума Ответить с цитированием
Старый 25.01.2018, 00:29   #2
Алексей0001
Пользователь
 
Регистрация: 25.11.2017
Сообщений: 39
По умолчанию

StringList-ы везде вроде уничтожаются
Алексей0001 вне форума Ответить с цитированием
Старый 25.01.2018, 06:22   #3
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 272
По умолчанию

Объекты нужно создавать после
Код:
if not OpenDialog1.Execute then
  exit;
, а не до.
Filka вне форума Ответить с цитированием
Старый 02.02.2018, 22:03   #4
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

удалите
Пишу много и развернуто

Последний раз редактировалось Heneken87; 02.02.2018 в 22:56.
Heneken87 вне форума Ответить с цитированием
Старый 02.02.2018, 22:25   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Тут 2 вопорса
1: Какой у вас объем файла
2: В каком месте получаете OutOf Memory?
Это при чем? Filka уже написал где утечка:
Код:
pl := TStringList.Create;
  if not OpenDialog1.Execute then
    exit; //здесь она
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.02.2018, 22:33   #6
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от Heneken87 Посмотреть сообщение
и свойство Execute класса TOpenDialog вернет True
А если вернёт False, то будет утечка

Цитата:
Сообщение от Heneken87 Посмотреть сообщение
В каком месте получаете OutOf Memory?
Он же даже скрин привёл. Нет Out Of Memory. Детектится Memory Leak.
Black Fregat вне форума Ответить с цитированием
Старый 02.02.2018, 22:48   #7
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

походу остапа понесло)
try
pl:= TStringList.Create;
if not OpenDialog1.Execute then
exit;
finally
FreeAndNil(pl);
end
Сории я сам затормозил.читал тему до этого о нехватке..да походу темы перпутал)))
Пишу много и развернуто

Последний раз редактировалось Heneken87; 02.02.2018 в 22:55.
Heneken87 вне форума Ответить с цитированием
Старый 02.02.2018, 23:08   #8
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Но все так вот это :
Цитата:
pl := TStringList.Create;
if not OpenDialog1.Execute then
exit;
pl.LoadFromFile(OpenDialog1.FileNam e);
// подготовил StringGrid1
StringGrid1.FixedCols := 0;
StringGrid1.FixedRows := 0;
StringGrid1.RowCount := pl.Count;
pl.Sort;
// теперь разбить по строкам и столбцам разделенных символом ^
tl := TStringList.Create;
tl.Delimiter := #9;
try
for i := 0 to pl.Count - 1 do
begin
tl.Clear;
tl.DelimitedText := pl.Strings[i];
if StringGrid1.ColCount < tl.Count then
StringGrid1.ColCount := tl.Count;
StringGrid1.Rows[i].Assign(tl);
end;
finally
FreeAndNil(tl);
FreeAndNil(pl);
end;
Ппавильнее всетаки вот так:
Цитата:
try
pl := TStringList.Create;
if not OpenDialog1.Execute then
exit;
pl.LoadFromFile(OpenDialog1.FileNam e);
// подготовил StringGrid1
StringGrid1.FixedCols := 0;
StringGrid1.FixedRows := 0;
StringGrid1.RowCount := pl.Count;
pl.Sort; // теперь разбить по строкам и столбцам разделенных символом ^
while pl.Count > 0 do
begin
try
tl := TStringList.Create;
tl.Delimiter := #9;
tl.DelimitedText := pl.Strings[0];
if StringGrid1.ColCount < tl.Count then
StringGrid1.ColCount := tl.Count;
StringGrid1.Rows[i].Assign(tl);
po.Delete(0);
finally
FreeAndNil(tl);
end;
end;
finally
FreeAndNil(pl);
end;
P/S Аллоо! Где двойной пробел?
Пишу много и развернуто
Heneken87 вне форума Ответить с цитированием
Старый 02.02.2018, 23:17   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Дык для кода #, а не цитирование. Пора бы и запомнить ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Утечка памяти [Освобождение памяти массива] denis76560 Общие вопросы Delphi 4 27.11.2016 18:20
Утечка памяти OmegaBerkut Общие вопросы Delphi 21 09.04.2015 22:12
Утечка памяти Juffin Общие вопросы Delphi 3 02.11.2010 12:11
Утечка памяти ZvEr_HaCkEr Свободное общение 13 24.09.2010 19:30
утечка памяти в С++ vengo Общие вопросы C/C++ 9 10.06.2008 21:24