Всем привет, подскажите в чем проблема и где подвох с этим 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 пустой почему-то возвращается, что за!?
потому что ты в функции удаляешь обьект MS.Free; ссылку на который возвращаешь из функции плюс утечка памяти в основной процедуре MS := TMemoryStream.Create; т.к. ссылка MS затирается новым значением
Что-то я не понял про утечку, покажи если не сложно, как избавиться от утечки?! Т.е. если я уберу MS.Free; из функции One, а буду освобождать в основной, тогда то не будет утечки?!
подвох мне кажется в том, что тебе лень курить мануалы. возьми себя в руки, глубоко вдохни, отложи спешку и начинай читать. профита потом поверь будет больше чем от советов
Вот тебе утечка памяти: 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, мне кажется правильно подметил)
1. IdHTTP передаю потому, что это поток, т.е. я из потока обращаюсь в функцию дабы не утерять куки, передаю HTTP. 2. Там надо склеить несколько картинок по этому обращаюсь за функциями 3. Спасибо за наглядность!
поток вещь такая, которая исполняет все твои прихоти. есть еще thread locale поддерживаемое на уровне компилятора - это чтото вроде static (__declspec(thread)) переменных, которые используются исключительно для конкретного потока. но это тоже тебе будет интересно