Das Problem ist relativ einfach zu erklären, und der Streit um dieses Problem ist subjektiver als objektiv. Die Verwendung von FreeAndNil ist einfach nicht nötig, wenn die variable Referenz auf das Objekt freigegeben wird den Gültigkeitsbereich verlassen wird:
procedure Test;
var
LObj: TObject;
begin
LObj := TObject.Create;
try
{...Do work...}
finally
//The LObj variable is going out of scope here,
// so don't bother nilling it. No other code can access LObj.
//FreeAndNil(LObj);
LObj.Free;
end;
end;
In dem obigen Code-Schnipsel, nilling die LObj
Variable sinnlos wäre, für den gegebenen Grund. Wenn jedoch eine Objektvariable während der Lebensdauer einer App mehrmals instanziiert und freigegeben werden kann, muss überprüft werden, ob das Objekt tatsächlich instanziiert ist oder nicht. Die einfache Möglichkeit, dies zu überprüfen, ist, ob der Objektverweis auf nil
gesetzt wurde. Um diese Einstellung auf nil
zu erleichtern, wird die Methode die Ressourcen freigeben und nil
für Sie festlegen.Dann können Sie im Code überprüfen, ob das Objekt entweder mit LObj = nil
oder Assigned(LObj)
instanziiert ist.
Der Fall, ob .Free
oder FreeAndNil()
in Objekt Destruktoren zu verwenden, ist eine Grauzone, aber zum größten Teil, sollte .Free
sicher sein, und in dem destructor sollte die Verweise auf Unterobjekte nilling unnötig. Es gibt verschiedene Argumente dafür, wie mit Ausnahmen in Konstruktoren und Destruktoren umzugehen ist.
Jetzt Aufmerksamkeit schenken: wenn Sie es vorziehen, ob zu wählen, und wählen .Free
oder FreeAndNil()
auf die besonderen Umstände oben umrissenen abhängig zu verwenden, das ist in Ordnung, aber beachten Sie, dass die Kosten eines Fehlers aufgrund nicht nilling einen befreit Objektverweis auf das anschließend zugegriffen wird, kann sehr hoch sein. Wenn auf den Zeiger später zugegriffen wird (Objekt freigegeben, aber Referenz nicht auf Null gesetzt), kann es passieren, dass Sie Pech haben und die Erkennung von Speicherbeschädigung viele Codezeilen entfernt von dem Zugriff auf die Referenz für freigegebene Objekte, die nicht freigegeben sind. Diese Art von Fehler kann sehr lange dauern, um zu reparieren, und ja, ich weiß, wie FastMM zu verwenden ist.
Deshalb ist es für einige Leute, mich eingeschlossen, Gewohnheit geworden (vielleicht eine faule), alle Objektzeiger einfach zu vernichten, wenn sie befreit sind, selbst wenn das Nilling nicht unbedingt notwendig ist.
fragte Sie eine schöne Frage hier. – Ampere