每循环一轮,内存使用大概增加几十k,还有那些资源没有释放?还是方法问题?请教    while isrun^ do//isrun是一个pboolean,用来控制线程循环
    begin
      try
        perl.Subject:=surl.Get(suri);//perl是正则表达控件,在前面create的,在线程destruct时候销毁了。
        perl.RegEx:=srule;
        perl.Options:=[preCaseLess];
        while perl.MatchAgain do
        begin
          tmp.Add(perl.SubExpressions[1]);//tmp是tstrings,在循环前创建,在循环结束后销毁了。现在就是怀疑乇鹗tstrings出的问题
          tmp.Add(perl.SubExpressions[2]);
        end;
      except
      end;
      sLog.Add(tmp.Strings[0] + '#' + tmp.Strings[1]);//FLog消息,详见:http://blog.itpub.net/resource/4034/LogUtils.pas
      tmp.Clear;
      for i:=0 to 100 do//这里只是想快速响应主窗体发送的退出线程指令
      begin
        Sleep(stime * 10);
        if not isrun^ then
        begin
          logout:=True;
          Break;
        end;
      end;
      if logout then
        Break;
    end;

解决方案 »

  1.   

    tmp := TStringList.Create;
    try
      ...
    finally
      tmp.Free
    end;
      

  2.   

    已有这个,具体是这样:
    try
    tm:=tstringlist.create;
    while .. do
    begin
    ...
    end;
    finally
    tmp.free;
    end;是不是这个tmp要放在循环里面?但是我觉得这样要经常create和free,蛮消耗的。所以才放到循环外面了
      

  3.   

    估计这不是重点,重点在sLog.Add(tmp.Strings[0] + '#' + tmp.Strings[1]);中的Strings[0]和Strings[1]有多大
      

  4.   

    这个是TPerlRegEx,当匹配不到符合数据,就退出循环了。
    这个循环是能退出,现在设置了大概30秒重复执行一次,每执行一次,内存又增加大概112k了。。
      

  5.   

    在.dpr文件里加上一句
    ReportMemoryLeaksOnShutdown := True;并把工程改为Debug模式,运行一次就知道问题是不是在这了
    还有,你可以用EurekaLog来帮你检测内存泄漏问题