Le problème est assez facile à expliquer, et la controverse autour de ce problème est plus subjective que objective. L'utilisation de FreeAndNil est tout simplement inutile si la variable référence à l'objet libéré sera hors de portée:
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;
Dans l'extrait de code ci-dessus, la variable nilling serait inutile, LObj
pour la raison donnée. Cependant, si une variable d'objet peut être instanciée et libérée plusieurs fois pendant la durée de vie d'une application, il devient alors nécessaire de vérifier si l'objet est effectivement instancié ou non. Le moyen le plus simple de vérifier cela est de savoir si la référence d'objet a été définie sur nil
. Afin de faciliter ce paramètre à nil
, la méthode FreeAndNil()
libèrera les ressources et définira nil
pour vous.Ensuite, dans le code, vous pouvez vérifier si l'objet est instancié avec LObj = nil
ou Assigned(LObj)
.
Le cas est une zone grise, mais pour la plupart, .Free
devrait être en sécurité, et nilling les références aux sous-objets dans le destructor devrait pas être nécessaire si vous souhaitez utiliser .Free
ou FreeAndNil()
objet dans Destructeurs. Il existe différents arguments sur la façon de traiter les exceptions dans les constructeurs et les destructeurs.
Maintenant, faites attention: si vous préférez choisir d'utiliser ou non .Free
ou FreeAndNil()
en fonction des circonstances spécifiques décrites ci-dessus, c'est très bien, mais il faut noter que le coût d'un bug à cause pas nilling une référence d'objet libéré qui est ensuite consulté peut être très élevé. Si le pointeur est ensuite accédé (objet libéré mais référence non définie), il peut arriver que vous soyez malchanceux et que la détection de la corruption de mémoire se passe de nombreuses lignes de code loin de l'accès à la référence d'objet libérée mais non indiquée. Ce genre de bug peut prendre beaucoup de temps à réparer, et oui, je sais comment utiliser FastMM.
Par conséquent pour certaines personnes, y compris moi, il est devenu une habitude (un paresseux, peut-être) de simplement nier tous les pointeurs d'objet quand ils sont libérés, même lorsque le nettoyage n'est pas strictement nécessaire.
Vous avez posé une question bien ici. – Ampere