Question

Je suis nouveau dans Delphi et j'ai déjà effectué des tests pour voir quelles variables d'objet et de pile sont initialisées par défaut:

TInstanceVariables = class
  fBoolean: boolean; // always starts off as false
  fInteger: integer; // always starts off as zero
  fObject: TObject; // always starts off as nil
end;

C’est le comportement auquel je suis habitué des autres langages, mais je me demande s’il est sans danger de le compter en Delphi? Par exemple, je me demande si cela pourrait dépendre d'un paramètre du compilateur, ou peut-être fonctionner différemment sur différentes machines. Est-il normal de s’appuyer sur les valeurs initialisées par défaut pour les objets, ou définissez-vous explicitement toutes les variables d’instance dans le constructeur?

En ce qui concerne les variables de pile (au niveau de la procédure), mes tests montrent que les booléens unitialisés sont vrais, les entiers unitalisés sont 2129993264 et que les objets non initialisés ne sont que des pointeurs invalides (c'est-à-dire non nuls). Je suppose que la norme est de toujours définir les variables au niveau de la procédure avant d'y accéder?

Était-ce utile?

La solution

Oui, il s'agit du comportement documenté:

  • Les champs d'objet sont toujours initialisés à 0, 0.0, '', False, nil ou ce qui convient.

  • Les variables globales sont toujours initialisées à 0, etc.;

  • Les variables locales comptées en référence * sont toujours initialisées à zéro ou '';

  • Les variables locales non comptées * ne sont pas initialisées, vous devez donc leur attribuer une valeur avant de pouvoir les utiliser.

Je me souviens que Barry Kelly a écrit quelque part une définition de "nombre de références comptées", mais ne la trouve pas. plus, cela devrait donc se faire entre-temps:

  

reference-counted == qui sont eux-mêmes comptés, ou   contenir directement ou indirectement des champs (pour les enregistrements) ou des éléments (pour   tableaux) qui sont comptés comme: chaîne, variante, interface   ou tableau dynamique ou tableau statique contenant de tels types.

Notes:

  • enregistrement ne suffit pas en soi pour compter les références
  • Je n'ai pas encore essayé avec des génériques

Autres conseils

Les variables globales sans initialiseur explicite sont allouées dans la section BSS de l'exécutable. Ils ne prennent pas réellement de place dans le fichier EXE; la section BSS est une section spéciale que le système d'exploitation alloue et met à zéro. Il existe des mécanismes similaires sur d'autres systèmes d'exploitation.

Vous pouvez compter sur l'initialisation à zéro des variables globales.

Les champs de classe ont la valeur zéro par défaut. Ceci est documenté pour que vous puissiez vous y fier. Les variables locales de la pile ne sont pas définies sauf si une chaîne ou une interface sont définies à zéro.

Juste comme note latérale (débutant dans Delphi): les variables globales peuvent être initialisées directement lors de leur déclaration:

var myGlobal:integer=99;

Voici une citation de Ray Lischners Delphi en bref Chapitre 2

  

"Lorsque Delphi crée un objet pour la première fois, tous les champs sont vides, c’est-à-dire que les pointeurs sont initialisés à zéro, que les chaînes et les tableaux dynamiques sont vides, que les nombres ont la valeur zéro, que les champs booléens sont Faux et que les variants sont défini sur Non attribué. (Voir NewInstance et InitInstance au chapitre 5 pour plus de détails.) "

Il est vrai que les variables de portée locale doivent être initialisées ... Je traiterais du commentaire ci-dessus selon lequel "les variables globales sont initialisées". comme douteux jusqu'à ce que fourni avec une référence - Je ne crois pas que.

modifier ... Barry Kelly dit que vous pouvez compter sur leur initialisation zéro. Etant donné qu'il fait partie de l'équipe de compilateur Delphi, je crois que c'est le cas :) Merci, Barry.

Les variables globales et les données d'instance d'objet (champs) sont toujours initialisées à zéro. Les variables locales dans les procédures et les méthodes ne sont pas initialisées dans Delphi Win32; leur contenu n'est pas défini jusqu'à ce que vous leur attribuiez une valeur dans le code.

Même si un langage offre des initialisations par défaut, je ne pense pas que vous devriez les utiliser. L’initialisation sur une valeur permet de mieux comprendre les autres développeurs qui ne connaissent peut-être pas les initialisations par défaut dans le langage et évite les problèmes entre les compilateurs.

À partir du fichier d'aide de Delphi 2007:

ms-help: //borland.bds5/devcommon/variables_xml.html

  

" Si vous n'initialisez pas explicitement une variable globale, le compilateur l'initialise à 0. "

J'ai un petit reproche avec les réponses données. Delphi met à zéro l'espace mémoire des objets globaux et des objets nouvellement créés. Bien que cela NORMALEMENT signifie qu'ils sont initialisés, il existe un cas dans lequel ils ne le sont pas: les types énumérés avec des valeurs spécifiques. Que faire si zéro n'est pas une valeur légale?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top