Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Erzeugtes Object wird nicht freigegeben? (https://www.delphipraxis.net/117452-erzeugtes-object-wird-nicht-freigegeben.html)

guidok 18. Jul 2008 10:25


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;

semike 18. Jul 2008 10:36

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

SirThornberry 18. Jul 2008 10:57

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.

guidok 18. Jul 2008 12:08

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?

SirThornberry 18. Jul 2008 12:43

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;

guidok 18. Jul 2008 13:06

Re: Erzeugtes Object wird nicht freigegeben?
 
Alles klar, danke! :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz