[Delphi] TMemoryStream из функции

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Kandi, 7 Sep 2011.

  1. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Всем привет, подскажите в чем проблема и где подвох с этим Stream'om имеется основная процедура -
    Code:
    procedure TForm1.Button9Click(Sender: TObject);
    var
      HTTP : TIdHTTP;
      MS : TMemoryStream;
    begin
      HTTP := TIdHTTP.Create(nil);
      MS := TMemoryStream.Create;
      try
        MS := one(HTTP, 'http://Url.ru/ajax?img=123');
        MS.SaveToFile('111.jpeg');
      finally
        HTTP.Free;
        MS.Free;
      end;
    end;
    
    И собственно функция One -
    Code:
    function one(HTTP : TIdHTTP; Url : String): TMemoryStream;
    var
      MS : TMemoryStream;
    begin
      MS := TMemoryStream.Create;
      try
        HTTP.Get(Url, MS);
        MS.Position := 0;
        Result := MS;
      finally
        MS.Free;
      end;
    end;
    
    MemoryStream пустой почему-то возвращается, что за!? :confused:
     
  2. BigSnake

    BigSnake New Member

    Joined:
    20 Apr 2010
    Messages:
    15
    Likes Received:
    1
    Reputations:
    0
    потому что ты в функции удаляешь обьект MS.Free; ссылку на который возвращаешь из функции

    плюс утечка памяти в основной процедуре MS := TMemoryStream.Create;

    т.к. ссылка MS затирается новым значением
     
  3. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Что-то я не понял про утечку, покажи если не сложно, как избавиться от утечки?!
    Т.е. если я уберу MS.Free; из функции One, а буду освобождать в основной, тогда то не будет утечки?!
     
  4. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,297
    Reputations:
    327
    подвох мне кажется в том, что тебе лень курить мануалы. возьми себя в руки, глубоко вдохни, отложи спешку и начинай читать. профита потом поверь будет больше чем от советов
     
  5. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Лит-ру в студию.
     
  6. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Вот тебе утечка памяти:
    Code:
    ..........
      MS := TMemoryStream.Create;
      try
        MS := one(HTTP, 'http://Url.ru/ajax?img=123');
    .........
    
    И функция One, как то так (инди ни разу не юзал, так что не знаю как там реализовано "HTTP.Get"):
    Code:
    function one(HTTP : TIdHTTP; Url : String): TMemoryStream;
    begin
    ........
        HTTP.Get(Url, Result);
    ........
    end;
    
    PS: а смысл передавать TIdHTTP в One, нельзя что ли в ней это сделать?

    Ну и sn0w, мне кажется правильно подметил)
     
  7. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    1. IdHTTP передаю потому, что это поток, т.е. я из потока обращаюсь в функцию дабы не утерять куки, передаю HTTP.
    2. Там надо склеить несколько картинок по этому обращаюсь за функциями
    3. Спасибо за наглядность! ;)
     
  8. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,297
    Reputations:
    327
    поток вещь такая, которая исполняет все твои прихоти. есть еще thread locale поддерживаемое на уровне компилятора - это чтото вроде static (__declspec(thread)) переменных, которые используются исключительно для конкретного потока. но это тоже тебе будет интересно