Voir
Et un regard sur la mise en œuvre:
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
Exemples
Considérez le code suivant:
procedure TForm1.FormCreate(Sender: TObject);
var
bm: TBitmap;
begin
bm := TBitmap.Create;
bm.LoadFromFile('C:\Users\Andreas Rejbrand\Documents\RAD Studio\6.0\Demos\DelphiWin32\VCLWin32\Football\up.bmp');
bm.Free;
if Assigned(bm) then
bm.SaveToFile('C:\Users\Andreas Rejbrand\Desktop\test.bmp')
else
ShowMessage('Cannot save! The bitmap does no longer exist!');
end;
Cela va créer une erreur ou un bitmap invalide (vide) sur mon bureau, parce que j'essaie d'utiliser un objet qui a été libéré. Oui, même si bm
a été libéré, il est toujours "affecté", c'est-à-dire bm
pointe toujours vers une adresse de mémoire, même s'il n'y a rien (utilisable) là. Pour surmonter cela, on peut définir bm := nil
, comme une sauvegarde, alors assigned(bm)
retournera faux, comme on le voudrait. Plus ou moins, FreeAndNil(bm)
est un raccourci pour bm.Free; bm := nil
. La première instruction libère toute la mémoire (et les ressources du système d'exploitation, le temps processeur utilisé par l'objet), et bm := nil
définit le "pointeur" bm
à nil
, de sorte que bm
ne pointe plus à l'endroit où l'objet était, mais pas c'est plus long. De cette façon vous (et les routines comme assigned
) ne serez pas dupé à croire qu'il existe toujours un objet bitmap.
Discussion
Certains disent que vous devriez toujours utiliser FreeAndNil(foo)
plutôt que foo.Free
. Eh bien pourquoi pas? L'instruction supplémentaire foo := nil
ne prendra probablement pas trop de nanosecondes à exécuter, et en effet assigned(foo) = false
est une très belle propriété d'un objet libéré. Mais encore une fois, si vous savez ce que vous faites, et sachez que vous n'allez plus jamais utiliser l'objet foo
après l'avoir libéré, alors vous pouvez vous en tenir à foo.free
. Vraiment, certains diront que dans de nombreux cas (mais pas tous), essayer d'utiliser une variable d'un objet libéré est un bug en soi. (Bien sûr, il y a des cas où vous faites cela intentionnellement - vous avez un objet foo
qui est attribué et est parfois parfois.)
Une discussion étendue ici: https://forums.embarcadero.com/thread.jspa?threadID=33112 –
@Sertac le fil, comme beaucoup d'autres, a disparu – mjn
Nouvelles discussions sont sur la non-technologie [ici] (https: //forums.embarcadero.com/thread.jspa?threadID=65321&tstart=15) et [ici] (https://forums.embarcadero.com/thread.jspa?threadID=63906&tstart=0) – mjn