2016-06-15 4 views
2

Ich versuche, das Http-Objekt in der Prozedur "FreeAndNilHttp" freizugeben und nil, aber nach dem Aufruf von FreeAndNilHttp wird das Objekt nicht frei und nil'd. Ist es unmöglich, eine Variable, die an eine andere Methode/Prozedur übergeben wurde, zu nullen?Delphi nil Object in anderen Methode

Beispielcode:

procedure FreeAndNilHttp(Http: TidHTTP); 
begin 
    Http.IOHandler.Free; 
    Http.IOHandler := nil; 
    Http.Free; 
    Http := nil; 
    // Http is in this procedure nil 
end; 

procedure TForm3.Button1Click(Sender: TObject); 
var Http: TidHTTP; 
begin 
    Http := TidHTTP.Create; 
    // ... create IOHandler and more stuff... 

    FreeAndNilHttp(Http); // <- not working 
    // Http is not nil 
end; 
+2

Sie übergeben einen Zeiger auf ein Objekt nach Wert. Das Objekt wird freigegeben, aber der ursprüngliche Zeiger ist nicht Null. –

+4

Was ist falsch daran, dieses Verfahren zu entfernen und Http.Free zu schreiben? Warum die Besessenheit, das Nichts zu vernichten, das sowieso verschwinden wird. Warum fühlen Sie sich verpflichtet, IOHandler zu zerstören? Willst du das nicht zerstören? Oder genießt du es einfach nur, Dinge wieder und wieder zu spritzen? –

+4

Ihr Code ist eine Verschwendung von CPU-Zyklen. Die lokale Variable 'Http' geht am Ende des Button-Click-Handlers aus dem Gültigkeitsbereich, so dass der Code den IOHandler freigibt und auf Null setzt sowie die Variable auf Null setzt (und damit den gesamten Aufruf von' FreeAndNilHttp') sind bedeutungslos. Der Aufruf von "Http.Free" am Ende des Button-Klick-Handlers führt das Gleiche ohne den gesamten verschwendeten Code und Overhead aus. Mit "Http: = TIdHTTP.Create (nil); versuch .... endlich Http.Free; Ende; '. –

Antwort

9

Die TidHTTP Instanz hinter dem Http Variable wird nach diesem Anruf befreit, aber das Http Variable selbst ist in der Tat nicht gleich Null. Dies liegt daran, dass Sie die Variable mit Wert übergeben. Dies bedeutet, dass der Parameter Http in der Routine auf dasselbe Objekt zeigt, jedoch nicht auf die gleiche Variable. Um der Lage sein, auf Null die Http Variable in TForm3.Button1Click erklärt, müssen Sie die Signatur der FreeAndNilHttp Routine in ändern:

procedure FreeAndNilHttp(var Http: TidHTTP); 

Jetzt können Sie die Http Variable durch Referenz passieren.

Aber das ist nicht notwendig, weil die Http Variable in TForm3.Button1Click wird weg sein, wenn diese Routine endet.

+0

Danke für die Erklärung. Ich verwechselte mich in diesem Fall mit den Objekten, die immer durch Referenzdenken weitergegeben werden. –

+0

Ja, Objekte werden als Referenz übergeben. Aber der Verweis auf ein Objekt (die Variable selbst) folgt den Sprachregeln wie jede andere Variable. – NGLN

+0

Objekte werden als Referenz übergeben. Ein Parameter wird als Referenz übergeben, wenn es sich um einen Parameter 'var' handelt. Eine Variable vom Typ class enthält einen Verweis auf ein Objekt. Wenn Sie jedoch eine Funktion übergeben, übergeben Sie eine Referenz nach Wert. –

Verwandte Themen