Je suis nouveau dans Delphi et j'ai exécuté des tests pour voir sur quelles variables objet et 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'appuyer dessus dans 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 unitialisés sont 2129993264 et 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 des variables au niveau de la procédure avant d'y accéder?
Réponses:
Oui, c'est le comportement documenté:
Les champs d'objets sont toujours initialisés à 0, 0.0, '', False, nil ou ce qui s'applique.
Les variables globales sont toujours initialisées à 0, etc.
Les variables locales comptées par référence * sont toujours initialisées à nil ou '';
Les variables locales sans 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 a écrit quelque part une définition de "référence-comptée", mais ne peut plus la trouver, donc cela devrait faire entre-temps:
Remarques:
record
lui-même ne suffit pas pour devenir une référencela source
TObject.Create
, qui est une méthode void, mais dansclass function TObject.InitInstance(Instance: Pointer): TObject;
laquelle est TOUJOURS appelée avant tout appel de constructeur, même pour les anciennes versions de Delphi. Votre commentaire est à mon humble avis faux et déroutant.Les variables globales qui n'ont pas d'initialiseur explicite sont allouées dans la section BSS de l'exécutable. Ils ne prennent 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 compter sur des variables globales initialisées à zéro.
la source
Les champs de classe sont zéro par défaut. Ceci est documenté afin que vous puissiez vous y fier. Les variables de la pile locale ne sont pas définies, sauf si la chaîne ou l'interface sont définies sur zéro.
la source
Juste comme note d'accompagnement (comme vous êtes nouveau dans Delphi): les variables globales peuvent être initialisées directement lors de leur déclaration:
la source
Voici une citation de Ray Lischners Delphi en bref Chapitre 2
Il est vrai que les variables locales dans la portée doivent être initialisées ... Je traiterais le commentaire ci-dessus selon lequel "les variables globales sont initialisées" comme douteux jusqu'à ce qu'ils soient fournis avec une référence - je ne le crois pas.
edit ... Barry Kelly dit que vous pouvez compter sur leur initialisation à zéro, et comme il fait partie de l'équipe de compilation Delphi, je crois que cela vaut :) Merci Barry.
la source
Les variables globales et les données (champs) d'instance d'objet 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 tant que vous ne leur attribuez pas une valeur dans le code.
la source
Même si un langage 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 pourraient ne pas connaître les initialisations par défaut dans le langage et évite les problèmes entre les compilateurs.
la source
Depuis le fichier d'aide de Delphi 2007:
ms-help: //borland.bds5/devcommon/variables_xml.html
la source
J'ai un petit reproche avec les réponses données. Delphi met à zéro l'espace mémoire des globaux et des objets nouvellement créés. Bien que cela signifie NORMALEMENT qu'ils sont initialisés, il existe 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 ??
la source
TOneTwoThree = (One=1, Two=2, Three=3);
Les variables inline nouvellement introduites (depuis Delphi 10.3) facilitent le contrôle des valeurs initiales.
la source