web-dev-qa-db-fra.com

Les variables delphi sont-elles initialisées avec une valeur par défaut?

Je suis nouveau sur Delphi, et j'ai exécuté des tests pour voir à quelles variables d'objet et quelles variables 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é dans d'autres langages, mais je me demande s'il est sûr de s'y fier dans Delphi? Par exemple, je me demande si cela peut 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 des 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 unitarisés sont vrais, les entiers unitialisés sont 2129993264 et les objets nonialisés ne sont que des pointeurs invalides (c'est-à-dire non nuls). Je suppose que la norme est de toujours définir des variables au niveau de la procédure avant d'y accéder?

98
MB.

Oui, c'est le comportement documenté:

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

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

  • Les variables locales comptées par référence * sont toujours initialisées à nil ou '';

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

Je me souviens que Barry Kelly quelque part a écrit une définition pour "compté par référence", mais ne peut plus la trouver, donc cela devrait faire entre-temps:

compté par référence == qui sont comptés par référence eux-mêmes, ou contiennent directement ou indirectement des champs (pour les enregistrements) ou des éléments (pour les tableaux) qui sont comptés par référence comme: string, variant, interface ou tableau dynamique ou tableau statique contenant ces types.

Remarques:

  • record lui-même ne suffit pas pour compter les références
  • Je n'ai pas encore essayé avec des génériques
100

Les variables globales qui n'ont pas d'initialiseur explicite sont allouées dans la section BSS de l'exécutable. Ils n'occupent en fait aucun espace dans l'EXE; la section BSS est une section spéciale que le système d'exploitation alloue et efface à zéro. Sur d'autres systèmes d'exploitation, il existe des mécanismes similaires.

Vous pouvez dépendre des variables globales initialisées à zéro.

26
Barry Kelly

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

20
Martin Liesén

Juste comme remarque (comme vous êtes nouveau dans Delphi): les variables globales peuvent être initialisées directement lors de leur déclaration:

var myGlobal:integer=99;
16
Heinrich Ulbricht

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 commencent vides, c'est-à-dire que les pointeurs sont initialisés à zéro, les chaînes et les tableaux dynamiques sont vides, les nombres ont la valeur zéro, les champs booléens sont faux et les variantes sont définies sur Non attribuées. (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 le commentaire ci-dessus que "les variables globales sont initialisées" comme douteuses jusqu'à ce qu'elles reçoivent une référence - je ne le crois pas.

modifier ... Barry Kelly dit que vous pouvez compter sur leur initialisation zéro, et comme il fait partie de l'équipe du compilateur Delphi, je crois que ça tient :) Merci Barry.

8
Drew Gibson

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 méthodes ne sont pas initialisées dans Win32 Delphi; leur contenu n'est pas défini jusqu'à ce que vous leur assigniez une valeur dans le code.

6
Ondrej Kelle

Depuis le 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."

4
Ondrej Kelle

Même si une langue propose des initialisations par défaut, je ne pense pas que vous devriez vous y fier. L'initialisation à une valeur le rend beaucoup plus clair pour 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.

4
Thomas Owens

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

3
Loren Pechtel