![]() |
Erzeugtes Object wird nicht freigegeben?
Ich habe mal eine kleine Verständnisfrage:
In der Indydemo für einen HTTP Server wird ein TFileStream.Create aufgerufen und damit wird doch eine Instanz erzeugt, die nie mehr freigegeben wird, oder versteh ich jetzt was falsch?
Delphi-Quellcode:
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var LFilename: string; LPathname: string; begin LFilename := ARequestInfo.Document; if AnsiSameText(LFilename, '/eliza.html') then begin Ask(ARequestInfo, AResponseInfo); end else begin if LFilename = '/' then begin LFilename := '/index.html'; end; LPathname := FHTMLDir + LFilename; if FileExists(LPathname) then begin AResponseInfo.ContentStream := TFileStream.Create(LPathname, fmOpenRead + fmShareDenyWrite); //<-- das hier meine ich end else begin AResponseInfo.ResponseNo := 404; AResponseInfo.ContentText := 'The requested URL ' + ARequestInfo.Document + ' was not found on this server.'; end; end; end; |
Re: Erzeugtes Object wird nicht freigegeben?
Hallo,
Die TFileStream Instanz wird vom aufrufenden Dispatcher freigegeben. Gibt man die Instanz vorzeitig frei, wird ein Zeiger ohne existierenden Objekt übergeben und das führt unweigerlich zu einer Schutzverletzung. Ich glaub mal, in der Hilfe steht auch etwas darüber drinnen. :wink: Michael |
Re: Erzeugtes Object wird nicht freigegeben?
wenn man nicht mit ContentStream arbeiten will spricht auch nichts dagegen die Daten aus der Datei in ContentText zu schreiben und somit den Stream noch in der Methode wieder frei geben zu können.
|
Re: Erzeugtes Object wird nicht freigegeben?
ContentStream ist schon OK. Ich bin nur etwas irritiert gewesen, dass hier in der Demo eine Instanz erzeugt wird und nicht wieder freigegeben. Sehe ich jetzt richtig, dass idHTTPServer die Instanz selbst wieder frei gibt?
|
Re: Erzeugtes Object wird nicht freigegeben?
so ist es. Der Quelltext von TIdHttpServer sieht grob vereinfacht so aus:
Delphi-Quellcode:
if Assigned(OnCommandGet) then //onCommandGet <> nil
begin OnCommandGet(lContext, lRequestInfo, lResponseInfo); if Assigned(lResponseInfo.ContentStream) then //lResponseInfo.ContentStream <> nil begin //Sende Stream [...] lResponseInfo.ContentStream.Free; end; end; |
Re: Erzeugtes Object wird nicht freigegeben?
Alles klar, danke! :thumb:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz