AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Erzeugtes Object wird nicht freigegeben?

Ein Thema von guidok · begonnen am 18. Jul 2008 · letzter Beitrag vom 18. Jul 2008
Antwort Antwort
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#1

Erzeugtes Object wird nicht freigegeben?

  Alt 18. Jul 2008, 10:25
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;
  Mit Zitat antworten Zitat
semike

Registriert seit: 30. Nov 2006
19 Beiträge
 
#2

Re: Erzeugtes Object wird nicht freigegeben?

  Alt 18. Jul 2008, 10:36
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.

Michael
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Erzeugtes Object wird nicht freigegeben?

  Alt 18. Jul 2008, 10:57
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#4

Re: Erzeugtes Object wird nicht freigegeben?

  Alt 18. Jul 2008, 12:08
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?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Erzeugtes Object wird nicht freigegeben?

  Alt 18. Jul 2008, 12:43
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#6

Re: Erzeugtes Object wird nicht freigegeben?

  Alt 18. Jul 2008, 13:06
Alles klar, danke!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 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