mse hat geschrieben:Nicht falsch. FreeAndnil ist unnötig, da obj nicht mehr verwendet wird. Die Verwendung von FreeAndnil ist für viele Programmierer ein Hinweis dafür, dass die Instanzvariable weiter verwendet wird und hier irreführend.
Diese "Irreführung" schadet aber auch nicht. Dafür gewöhnt man sich dadurch die konsequente Nutzung von
FreeAndNil an. In Verbindung mit der grundsätzlichen Initialisierung der Variablen mit
nil, ist das eine gute Sache.
mse hat geschrieben:FreeAndNil kann gefährlich sein, wenn im Destruktor auf die Instanzvariable zugegriffen wird, da die dann bereits nil ist (FreeAndNil bedeutet eigentlich NilAndFree).
Das soll man ja auch nicht machen. Das Objekt sollte eigentlich niemals etwas von Instanzvariablen wissen. Abgesehen von wirklichen Spezialfällen wie bei einer Singleton-Implementierung. Und da baut man das ganze dann so sicher wie möglich.
mse hat geschrieben:Bei Formularen und globaler Instanzvariable kann das bei event handlern vorkommen, welche aus destroy() oder afterdestruction() heraus aufgerufen werden und wo sich der Programmierer im On* event dessen vielleicht nicht bewusst ist.
Ist auch keine gute Idee, dafür gibt es ja
Self.
mse hat geschrieben:Code: Alles auswählen
try
obj := TObj.Create;
try
obj.DoSomething;
finally
obj.Free;
end;
except
// error log
end;
Nicht falsch, obj.Free könnte durch obj.Destroy ersetzt werden. Im except-Abschnitt darf nicht auf obj zugegriffen werden, da obj im Falle einer exception in Create undefiniert ist.
Viel schlimmer: Auch im Falle einer Exception in
DoSOmething ist
obj undefiniert. Da das
finally immer vor dem
except durchgeführt wird. Deshalb empfahl ich in meinem vorherigen Post auch eine andere Reihenfolge.
mse hat geschrieben:obj.Free könnte wieder durch obj.Destroy ersetzt werden.
Was hast du eigentlich immer mit dieser Ersetzung? Die Anwendung, die Performanceprobleme hat, weil
Free und nicht
Destroy benutzt wird, möchte ich erst einmal sehen. Und dann kann man ja immer noch optimieren.