2015-11-21 4 views
1

У меня проблема с использованием записей Delphi Regex. Это моя проблема Код:Устранение утечки памяти с помощью TMatchCollection/TMatch

function CrawlThread.CrawlLinks: bool; 
var 
    Matches: TMatchCollection; 
    Match: TMatch; 
    i: integer; 
begin 
Matches:= TRegex.Matches(code, frmCrawler.Edit2.Text); 
     if Matches.Count > 0 then 
     begin 
     i:= 0; 
     for Match in Matches do 
     begin 
      SetLength(CrawledLinks, i + 1); 
      if (POS('https://', Match.Value) = 0) then 
      CrawledLinks[i]:= 'http://' + Match.Value 
      else 
      CrawledLinks[i]:= Match.Value; 
      inc(i); 
     end; 
     Result:= true; 
     end; 
     Matches:= TRegex.Matches(code, frmCrawler.Edit3.Text); 
     if Matches.Count > 0 then 
     begin 
     i:= 0; 
     for Match in Matches do 
     begin 
      SetLength(FollowLinks, i + 1); 
      if (POS('https://', Match.Value) = 0) then 
      FollowLinks[i]:= 'http://' + Match.Value 
      else 
      FollowLinks[i]:= Match.Value; 
      inc(i); 
     end; 
     Result:= true; 
     end; 

Этот код будет вызываться несколько раз внутри нитей, если я комментирую его, я получаю как 26 Мб на использование памяти, и не растет ... Когда я использую его, я начинаю вокруг 50 МБ (что не проблема), но он продолжает расти, как 1 МБ в минуту (через 1 мин этот код называется сотни раз).

Использование ReportMemoryLeaksOnShutdown: = true; я получаю этот выход: enter image description here

Это почти то же самое, когда комментировал или с помощью кода, так что я не считаю, что это объяснить 1Мб за минуту при использовании кода. Конечно, утечки UnicodeString беспокоят меня, но поскольку я получаю их, даже когда не использую код, я не думаю, что это проблема. Есть ли какая-нибудь идея, почему этот код потребляет столько памяти?

+1

Этот код не производит эти утечки. Пожалуйста, сделайте [mcve] и спросите еще раз. –

+0

Да, я знаю, что с этим кодом трудно понять. Но, как я уже сказал, когда я прокомментировал это, я не получаю, что огромная память, растущая каждую минуту ... Вы уверены, что этот код не производит эти утечки? И почему ReportMemoryLeaksOnShutdown не показывает мне больше утечек при использовании/не использовании этого кода? Может быть, общий для TRegex потребляет огромную память (даже без утечек)? – user3810691

+1

Пожалуйста, сделайте [mcve]. –

ответ

1
  1. Я не думаю, что какой-либо из показанного кода протекает, так как TMatchCollection и TMatch чистые записи.

  2. Я видел подобное наращивание памяти из-за выделения строк. Но через некоторое время он должен стабилизироваться, если только они не добавлены в TStringList, не очищая его.

  3. Это приводит меня к следующему: окно сообщения говорит о 2 x TStringList, которые никогда не освобождаются. Вы пробовали так искать свой проект для всех TStringList.Create и удостоверились, что есть соответствующие TStringList.Free? Аналогичным образом для TCriticalSection и TIdHashMessageDigest5?

  4. Просто для того, чтобы быть уверенным: в приведенном выше коде кажется, что это метод внутри класса Thread? Если это так, это приведет к ошибкам, относящимся к компонентам frmCrawler.Edit2.Text и frmCrawler.Edit3.Text в потоке VCL.

Смежные вопросы