Конференция "Сети" » Indy+Socks Proxy = утечка памяти [D7]
 
  • stas © (12.06.12 12:02) [0]
    Есть функция,которая по линку выкачивает файл и сохраняет его на диск. Выкачивает через Socks Proxy.
    В итоге каждое выкачивание дает утечку памяти в 1 мегабайт.
    Если качать напрямую или через http proxy утечки нет. Возможно я что-то не так делаю?
    Вот код:

    function LoadFile(Link:string):string;
    var http:Tidhttp;
        S:TFileStream;
        FileName:String;
        IdIOHandlerSocket: TIdIOHandlerSocket;
        IdSocksInfo: TIdSocksInfo;

    begin
     http:=Tidhttp.Create(nil);
     IdIOHandlerSocket:= TIdIOHandlerSocket.Create(nil);
     IdSocksInfo:= TIdSocksInfo.Create(nil);
     http.IOHandler:= IdIOHandlerSocket;
     IdSocksInfo.IOHandler:=IdIOHandlerSocket;
     IdSocksInfo.Host:='192.168.17.253';
     IdSocksInfo.Port:=5512;
      IdSocksInfo.Version:=svSocks5;

     FileName:='D:\MyFile.dat';
     S:=TFileStream.Create(FileName,fmCreate);
      try
        http.Get(Link,S);
        Result:=FileName;
      except
      end;
     S.Free;
     http.Free;
     IdIOHandlerSocket.Free;
     IdSocksInfo.Free;
    end;

  • Cobalt © (12.06.12 15:15) [1]
    1) ReportmemoryLeakOnShutdown := True покажет тебе в чем утечка (если она есть)
    2) Как ты определяешь эту утечку?
  • brother © (12.06.12 15:43) [2]
    >  except
    >  end;
    > S.Free;
    > http.Free;

    при исключении не вызывается уничтожение объектов s и http, а исключения ты гасишь и не обрабатываешь:)
  • stas © (12.06.12 16:35) [3]
    >Cobalt ©   (12.06.12 15:15) [1]
    1. А это где надо включить ?
    2. В диспетчере задач смотрю

    >brother ©   (12.06.12 15:43) [2]
    Почему не вызывается? все что за except...end выполняется же.
    В реальной задачи у меня пишется в исключение в лог.
  • brother © (12.06.12 16:38) [4]
    > все что за except...end выполняется же.


    нет будет выход из функции
  • stas © (12.06.12 16:54) [5]
    brother ©   (12.06.12 16:38) [4]
    Я отладчиком проверял, заходит в любом случае.
  • brother © (12.06.12 17:02) [6]
    не надо ляля... ;)
  • brother © (12.06.12 17:11) [7]
    зы. я шучу ;)
  • Cobalt © (12.06.12 18:47) [8]
    1) В dpr надо записать, после первого begin
    или в OnCreate MainForm
    Хотя, если у тебя Delphi7, то воспользуйся менеджером FastMM
    2) Это не очень корректный инструмент. вот EOutOfMemory - это верный знак :)
    А вообще, почитай специалиста:
    http://www.gunsmoker.ru/2009/05/blog-post_24.html
  • stas © (12.06.12 19:10) [9]
    Cobalt ©   (12.06.12 18:47) [8]
    ок, спасибо!
 
Конференция "Сети" » Indy+Socks Proxy = утечка памяти [D7]
Есть новые Нет новых   [134435   +17][b:0][p:0.001]