Prima, jetzt werden wir konkret
Delphi-Quellcode:
f := TFoo.Create;
Try
b := TBar.Create
Try
b.DoSomething();
f.Work();
Finally
b.Free
End
Finally
f.free;
End;
// --- vs
f := TFoo.Create;
b := TBar.Create
b.DoSomething();
f.Work();
b.Free
f.free;
also das würde ich schon mal umbauen zu:
Delphi-Quellcode:
b := TBar.Create;
try
b.DoSomething();
finally
b.Free
end
f := TFoo.Create;
try
f.Work();
finally
f.free;
end;
und wenn ich diesen Code sehe ...
Delphi-Quellcode:
f := TFoo.Create;
b := TBar.Create
b.DoSomething();
f.Work();
b.Free;
f.free;
sehe ich 2 potenzielle Speicherlöcher. Um sicher zu gehen, dass der Code keine Speicherlöcher erzeugt, muss ich nun prüfen, ob TBar.Create, b.DoSomething und f.Work keine Exceptions werfen. Falls ich Glück habe und TBar.Create erstellt, wie ich anhand der Namen vermute, tatsächlich ein neues Objekt, bin ich allerdings schnell damit fertig, weil dann eine EOutOfMemory-
Exception geworfen werden könnte und damit wäre der Code für mich definitiv gefährlich.