Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

Подскажите где утечка
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, 01:29   #2
Алексей0001
Пользователь
 
Регистрация: 25.11.2017
Сообщений: 39
Репутация: 10
По умолчанию

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

Объекты нужно создавать после
Код:

if not OpenDialog1.Execute then
  exit;

, а не до.
Filka вне форума   Ответить с цитированием
Старый 02.02.2018, 23:03   #4
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 168
Репутация: 39
По умолчанию

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

Последний раз редактировалось Heneken87; 02.02.2018 в 23:56.
Heneken87 вне форума   Ответить с цитированием
Старый 02.02.2018, 23:25   #5
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,093
Репутация: 6385
По умолчанию

Цитата:
Тут 2 вопорса
1: Какой у вас объем файла
2: В каком месте получаете OutOf Memory?
Это при чем? Filka уже написал где утечка:
Код:

pl := TStringList.Create;
  if not OpenDialog1.Execute then
    exit; //здесь она

__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар на форуме   Ответить с цитированием
Старый 02.02.2018, 23:33   #6
Black Fregat
Программист
Профессионал
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,144
Репутация: 840
По умолчанию

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

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

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

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

Но все так вот это :
Цитата:
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 вне форума   Ответить с цитированием
Старый 03.02.2018, 00:17   #9
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,093
Репутация: 6385
По умолчанию

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


22:56.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru