2 Stimmen

Was ist die Alternative zu FreeAndNil in Delphi 7?

Ich habe Zweifel, ob FreeAndNil der ideale Ansatz ist, um ein Objekt zu entsorgen. Ich bin auf Codes gestoßen, in denen etwas wie

StringList1.Free; 
StringList1 := Nil;

verwendet wird. Ist die obige Zeile ein Overkill, oder ist sie eine bessere Lösung? Worin besteht der Unterschied zwischen den beiden Ansätzen?

9voto

Ondrej Kelle Punkte 36511

Streng genommen müssen Sie, um ein Objekt zu entsorgen, nur die Funktion Destroy . Wenn die Referenz jedoch nil keinen Zeiger auf eine gültige Instanz eines Objekts zugewiesen bekommen hat, würde dies zu einer Zugriffsverletzung führen, weshalb empfohlen wird, den Aufruf Free die zuerst prüft, ob die übergebene Referenz Null ist und in diesem Fall nichts tut. FreeAndNil weist die übergebene Referenz zunächst einer temporären lokalen Variablen zu, dann wird nil auf die übergebene Referenz und ruft dann Free um die Instanz zu entsorgen. Der einzige Unterschied zwischen FreeAndNil und Ihre Sequenz obj.Free; obj := nil; ist, dass im ersten Fall die übergebene Referenz nil auch wenn der Destruktor eine Ausnahme auslöst.

5voto

David Heffernan Punkte 585606

Der Code in Ihrer Frage wurde wahrscheinlich von jemandem geschrieben, der keine Ahnung von FreeAndNil . Oder vielleicht wurde es ursprünglich geschrieben, bevor FreeAndNil zu RTL hinzugefügt wurde. Wenn Sie den Verweis aufheben wollen, können Sie ebenso gut FreeAndNil . Es ist nicht hilfreich, sie mit der Hand aufzuschreiben.

Der einzige wirkliche Unterschied besteht darin, dass FreeAndNil setzt den Verweis auf Nil auch wenn Free erhebt. Aber Ihre Destruktoren sollten sowieso nie erhöhen, so dass dies nicht, dass eine große Sache in meinen Augen.

Es gibt eine gemeinsame Falle mit FreeAndNil . Da er einen nicht typisierten Parameter annimmt, können Sie ihm alles übergeben. Zum Beispiel können Sie eine Schnittstelle, einen Datensatz usw. übergeben. Wenn Sie diesen Fehler machen, kommt es in der Regel zu seltsamen Laufzeitfehlern.

Ich werde jetzt nicht darüber diskutieren, ob FreeAndNil ist eine geeignete Wahl für die Gestaltung. Dieses Thema wurde bereits an anderer Stelle ausführlich behandelt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X