Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.03.2013, 17:19
Pcrepair
 
Сообщения: n/a
По умолчанию Небольшая утечка памяти с 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,SWords,L); в общем функция получает две строки1 и 2 и число, сравнивает слова в строках и если число совпадений превышает порог переносит строку1 на выход.

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

ВОпросы:
1. как вообще можеть быть утечка при наличии try-finally-end вроде бы гарантирующее уничтожение объектов
2. как вообще определить где конкретно это происходит
3. может быть код кривой? тогда где?
Ответить с цитированием
  #2  
Старый 17.03.2013, 22:11
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Попробуй так
Код:
function DelParagraph(const Str1,Str2:string; L:integer):string;
var
  J, I, Count, D, G : Integer;
  Word1, Word2 : String;
  T1, T2 : TStringList;
begin
  Result := '';
  Count := 0;                                      
  if Length(Str1) = 0 then
    Exit;

  T1 := TStringList.Create;
  try
    T2 := TStringList.Create;
    try
      T2.Sorted := True;
      T2.Duplicates := dupIgnore;
      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
              Inc(Count);                    
          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(T2);
    end;
  finally
    FreeAndNil(T2);
  end;
end;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Pcrepair (18.03.2013)
  #3  
Старый 19.03.2013, 10:21
Pcrepair
 
Сообщения: n/a
По умолчанию

итого получилось следующее

Код:
function DelParagraph(const Str1,Str2:string; L:integer):string;
(*--------------------------------------------------*)
(*  17.03.13  Функция удаления символов <ggg>*)
function Del(const AData:string):string;
var
Pos1,Pos2:integer;
Buf:string;
begin
Buf:=AData;
  while Pos1 > 0 do
    begin
      Pos1:=PosEx('<',Buf,1);
      Pos2:=PosEx('>',Buf,Pos1);
      if (Pos1 = 0) or (Pos2 = 0) then Break;   (*защита*)
      Delete(Buf,Pos1,(Pos2-Pos1));
    end;
    Result:=Buf;
end;
(*--------------------------------------------------*)
var
J,I,Count,G:integer;
T1,T2:TStringList;
begin
Result:='';
Count:=0;
if Length(Str1) > 0 then
  begin
   T1:=TStringList.Create;
   T2:=TStringList.Create;
     try
       T2.Sorted := true;                             
       T2.Duplicates := dupIgnore;                
       T1.Text:=SpliteText(Del(Str1));        
       G:=(T1.Count);                              
       T2.Text:=SpliteText1(Str2);                 
       for I := 0 to T2.Count-1 do
        for J := 0 to T1.Count-1 do
         if CompareWords(T2[i],T1[J]) then
           Inc(Count);
         if (Count > 0) and (G > 0)   and ((Count*100 Div G) > L) then
         Result:=Str1;
     finally
        FreeAndNil(T1);
        FreeAndNil(T2);
     end;
  end else Exit;
end;

какие есть еще недоработки?
Ответить с цитированием
  #4  
Старый 19.03.2013, 10:26
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Как минимум - форматирование.
и вот это не совсем верно:
Код:
function Del(const AData:string):string;
var
Pos1,Pos2:integer;
Buf:string;
begin
Buf:=AData;
  while Pos1 > 0 do // переменная Pos1 можеть быть любого значения, в т.ч. и нулевого, ибо она не проинициализирована
    begin
      Pos1:=PosEx('<',Buf,1);
      Pos2:=PosEx('>',Buf,Pos1);
      if (Pos1 = 0) or (Pos2 = 0) then Break;   (*защита*)
      Delete(Buf,Pos1,(Pos2-Pos1));
    end;
    Result:=Buf;
end;
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 19.03.2013, 10:42
Pcrepair
 
Сообщения: n/a
По умолчанию

да, точно, компилятор предупреждает
так что делать? присвоить до цикла какое то значение? но какое?
Ответить с цитированием
  #6  
Старый 19.03.2013, 14:34
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pcrepair
да, точно, компилятор предупреждает
так что делать? присвоить до цикла какое то значение? но какое?
У Вас внутри тела цикла уже есть проверка
Код:
function Del(const AData:string):string; 
var
  Pos1,Pos2:integer; 
  Buf:string;
begin
  Buf:=AData;  
  while true do //    
    begin      
      Pos1:=PosEx('<',Buf,1);       
      if (Pos1 = 0) then Break;   
      Pos2:=PosEx('>',Buf,Pos1);       
      if (Pos2 = 0) then Break;   (*защита*)      
      Delete(Buf,Pos1,(Pos2-Pos1));
   end;     
  Result:=Buf; 
end;
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
Pcrepair (19.03.2013)
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:56.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025