Hallo Christian,
ich habe jenen Titel (lediglich den Vorgänger) von Herrn Kosch leider nicht gelesen, kann aber bestätigen, dass der Delphicompiler bei einem
const Paramter keinen Code zur Referenzzählung und den damit verbundenen impliziten
Try/Finally-Block generiert.
Dies kann uU einige Nebeneffekte haben, wenn man sich Signaturen der Art
Delphi-Quellcode:
procedure UsesRefCount(AnObject: IInterface);
procedure IgnoresRefCount(const AnObject: IInterface);
ansieht. Sollte man jene Routinen mit Objekten aufrufen, bei denen der Referenzzähler zuvor null betrug, gibt die erste Variante das Objekt selbsständig frei und die vorherige Referenz ist ungültig während die zweite Variante die Verantwortlichkeit des Speicherfreigabe dem Klienten überlässt.
Delphi-Quellcode:
var
myObject: TInterfacedObject;
begin
myObject := TInterfacedObject.Create;
UsesRefCount(myObject);
// myObject is still<>nil but already freed
// myObject.Free could cause an error!
gegenüber der Variante 2
Delphi-Quellcode:
var
myObject: TInterfacedObject;
begin
myObject := TInterfacedObject.Create;
try
IgnoreRefCount(myObject);
// myObject is untouched and has to be freed!
finally
FreeAndNil(myObject);
end;
Selbiges gilt auch für Strings wobei dies keinen weiteren Eingriff seitens des Programmierers erfordert...