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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2013, 17:17   #1
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 267
По умолчанию Небольшая утечка памяти с TStringList

Добрый день. Есть код функции:

Код:
function DelParagraph(const Str1,Str2:string; L:integer):string;
var
J,I,Count,D,G:integer;
Word1,Word2: string;
T1,T2:TStringList;
begin
T1:=TStringList.Create;
T2:=TStringList.Create;
T2.Sorted := true;              
T2.Duplicates := dupIgnore;                  
Result:='';
if Length(Str1) = 0 then Exit;
 Count:=0;                                      
   try
      T1.Text:=SpliteText(Del(Str1));          
      G:=(T1.Count);                           
      T2.Text:=SpliteText(Str2);               
      for I := 0 to T2.Count-1 do              
        begin
         Word1:=(T2[I]);                       
          begin
           for J := 0 to T1.Count-1 do         
            begin
             Word2:=(T1[J]);                   
              if CompareWords(Word1,Word2) then
               begin
                Inc(Count);                    
               end;
            end; 
          end;
        end; 
        if (Count = 0) or (G = 0) then         
        Exit
        else
        D:=((Count*100 Div G)); 
        if D > L then
        Result:=Str1;
   finally
      FreeAndNil(T1);
      FreeAndNil(T2);
   end;
end;
Del, SpliteText, CompareWords - вызываемые функции, то же имеют TStringList и везде try-finally-end;
Вызов функции:
FullStr3:=DelParagraph(FullStr2,SWo rds,L); в общем функция получает две строки1 и 2 и число, сравнивает слова в строках и если число совпадений превышает порог переносит строку1 на выход.

Проблема состоит в том что при завершении программы ReportMemoryLeaksOnShutdown выдает сообщение о небольшой утечке памяти в TStringList
если заблокировать вызов функции, то утечка пропадает

ВОпросы:
1. как вообще можеть быть утечка при наличии try-finally-end вроде бы гарантирующее уничтожение объектов
2. как вообще определить где конкретно это происходит
3. может быть код кривой? тогда где?
Pcrepair вне форума Ответить с цитированием
Старый 17.03.2013, 17:21   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

T1:=TStringList.Create;
T2:=TStringList.Create;
...
if Length(Str1) = 0 then Exit;
Count:=0;
try
...
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.03.2013, 17:31   #3
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Кстати, хороший пример, показывающий вредность использования exit.
s-andriano вне форума Ответить с цитированием
Старый 17.03.2013, 17:37   #4
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 267
По умолчанию

так что екзит? тут много рассказывали что в try-finally-end все одно после екзита буде выполнено.
так не слишком криво:
Код:
if Length(Str1) = 0 then
begin
  FreeAndNil(T1);
  FreeAndNil(T2);
  Exit;
end;
хотя помогло

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Кстати, хороший пример, показывающий вредность использования exit.
так так, а что взамен? а то этот екзит постоянно применять приходится

Последний раз редактировалось Stilet; 17.03.2013 в 17:56.
Pcrepair вне форума Ответить с цитированием
Старый 17.03.2013, 17:40   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
все одно после екзита буде выполнено
Если exit в блоке try
Код:
try
  if Length(Str1) = 0 then Exit;
  Count:=0;                                      
  T1.Text:=SpliteText(Del(Str1));          
  G:=(T1.Count);                           
  T2.Text:=SpliteText(Str2);
  ....
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 17.03.2013 в 17:42.
Аватар вне форума Ответить с цитированием
Старый 17.03.2013, 17:46   #6
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 267
По умолчанию

так еще лучше, спасибо за пример
Pcrepair вне форума Ответить с цитированием
Старый 17.03.2013, 18:18   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Pcrepair Посмотреть сообщение
так так, а что взамен? а то этот екзит постоянно применять приходится
exit - это нарушающий структуру выход из подпрограммы.
Используйте вместо него полноценную конструкцию if then else.
Это немного дольше писать, зато намного быстрее отлаживать.

Цитата:
Сообщение от Pcrepair Посмотреть сообщение
так еще лучше, спасибо за пример
Еще лучше поставить
Цитата:
Result:='';
if Length(Str1) = 0 then Exit;
первыми строками функции - до создания стринглистов, если уж Вы не хотите отказываться от exit.

Последний раз редактировалось Stilet; 17.03.2013 в 18:38.
s-andriano вне форума Ответить с цитированием
Старый 17.03.2013, 18:22   #8
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 267
По умолчанию

типа чтобы после else оказался последний оператор и end?
а можно усеченный пример(только if Length(Str1) = 0 then Exit) выше приведенного кода?
Pcrepair вне форума Ответить с цитированием
Старый 17.03.2013, 18:30   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Pcrepair Посмотреть сообщение
типа чтобы после else оказался последний оператор и end?
а можно усеченный пример(только if Length(Str1) = 0 then Exit) выше приведенного кода?
Собственно, здесь ветка else даже не нужна.
Я бы написал так:
Код:
begin
  Result:='';
  if Length(Str1) > 0 then begin
    T1:=TStringList.Create;
    T2:=TStringList.Create;
...
  end;
end;
Не нужно создавать объекты, если Вы с ними ничего не собираетесь делать.
s-andriano вне форума Ответить с цитированием
Старый 17.03.2013, 19:08   #10
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 267
По умолчанию

попробуем поменять логику в используемых функциях, посмотрим что будет. спасибо
Pcrepair вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
утечка памяти Кудаив Помощь студентам 1 30.04.2012 18:18
Утечка памяти forivanb Общие вопросы Delphi 4 11.04.2012 15:28
Утечка памяти 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