[Delphi] Утечка памяти, программа набирает 500-1000MB оперативки

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Diamantx, 25 Nov 2013.

  1. Diamantx

    Diamantx New Member

    Joined:
    17 Feb 2012
    Messages:
    64
    Likes Received:
    1
    Reputations:
    0
    Такая проблема: программа работает в многопоточном режиме. Всего три разновидности потока. Один из них запускается множество раз и в реальном времени в среднем работает в 50-и экземплярах.

    Так вот в этих потоках при завершении действия я убиваю отслужившие свое объекты, но это не помогает.

    Пробовал в конце кода добавлять следующую строку:

    self.terminate;

    Но не помогло. Как быть и что делать?
     
  2. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Ну где-то значит не убивается, или в используемом классе деструктор кривой, по очередно по убирай обьекты и смотри где что не так.
     
  3. Diamantx

    Diamantx New Member

    Joined:
    17 Feb 2012
    Messages:
    64
    Likes Received:
    1
    Reputations:
    0
    Уже пробовал убивать все что только можно. Заметил, что занимаемая оперативка не всегда прибавляется, бывает и скачет вниз. Возможно-ли, что на 50 потоков столько оперативки и выходит, если там используются Indy, RegEx и т.д.?
     
  4. muip

    muip New Member

    Joined:
    1 Sep 2011
    Messages:
    45
    Likes Received:
    4
    Reputations:
    0
    Необязательно память загружается объектами потока. Возможно ты в какое-нибудь Memo грузанул хуеву тучу строк допустим из файла, или там в tstringlist.
     
  5. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Diamantx, в конструкторе класса потока или при создании экземпляра нужно установить свойство FreeOnTerminate в true. 99% ты забыл это сделать.

    Если версия Delphi не ниже XE, то в самом начале программы вставь строчку
    Code:
    ReportMemoryLeaksOnShutdown := true;
    Хотя бы при выходе из программы увидишь что не удаляешь из памяти.
     
  6. Diamantx

    Diamantx New Member

    Joined:
    17 Feb 2012
    Messages:
    64
    Likes Received:
    1
    Reputations:
    0
    Нашел проблемный кусок кода:

    Code:
    RegEx := TRegEx.Create
          ('<defindex>\d{1,15}</defindex>\s*<level>\d{1,15}</level>\s*<quality>\d{1}</quality>');
    M := RegEx.Matches(user_info);
    
        for s := 0 to M.Count - 1 do
        begin
          item_id := M.Item[s].Value;
          item_id := copy(item_id, pos('<defindex>', item_id) + 10, 50);
          delete(item_id, pos('</defindex>', item_id), 150);
    
          quality := M.Item[s].Value;
          quality := copy(quality, pos('<quality>', quality) + 9, 50);
          delete(quality, pos('</quality>', quality), 200);
    
          users_items.add(user_id + ':' + item_id + ':' + quality);
        end;
    
    Если закомментировать строку M := RegEx.Matches(user_info); , то занимаемая оперативка держится на 20мб. RegEx - встроенный компонент в XE5. Как быть?
     
  7. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Подозреваю, что должно быть хотя бы так:
    Code:
    RegEx := TRegEx.Create('<defindex>\d{1,15}</defindex>\s*<level>\d{1,15}</level>\s*<quality>\d{1}</quality>');
    try
      M := RegEx.Matches(user_info);
      if Assigned(M) then
      try
        for s := 0 to M.Count - 1 do
        begin
          item_id := M.Item[s].Value;
          item_id := copy(item_id, pos('<defindex>', item_id) + 10, 50);
          delete(item_id, pos('</defindex>', item_id), 150);
    
          quality := M.Item[s].Value;
          quality := copy(quality, pos('<quality>', quality) + 9, 50);
          delete(quality, pos('</quality>', quality), 200);
    
          users_items.add(user_id + ':' + item_id + ':' + quality);
        end;
      finally
        M.Free;
      end;
    finally
      RegEx.Free;
    end;
     
  8. Diamantx

    Diamantx New Member

    Joined:
    17 Feb 2012
    Messages:
    64
    Likes Received:
    1
    Reputations:
    0
    Всем спасибо за помощь. Сделал гораздо проще - заменил этот кусок кода с RegEx на циклы.