125 votes

Pourquoi les pointeurs ne sont-ils pas initialisés avec NULL par défaut?

Je suppose que cela a été répondu avant, mais je n'arrivais pas à trouver la réponse ici ou sur Google, mais je pense que c'est parce que je ne pouvais pas la bonne question...

Quelqu'un peut-il expliquer pourquoi ne sont pas des pointeurs initialisé à NULL?
Exemple:

  void test(){
     char *buf;
     if (!buf)
        // whatever
  }

Le programme ne serait pas l'étape intérieur de la si à cause d' buf n'est pas nulle.

Je voudrais savoir pourquoi, dans ce cas nous avons besoin d'une variable avec la corbeille, spécialement les pointeurs s'adressant à des déchets sur la mémoire?

165voto

Loki Astari Points 116129

Nous sommes tous conscients que le pointeur (et d'autres types POD) doit être initialisé.
La question devient alors "qui doit initialiser".

Bien il existe essentiellement deux méthodes:

  • Le compilateur initialise.
  • Le développeur initialise.

Supposons que le compilateur initialisé toutes les variables qui ne sont pas explicitement initialisée par le développeur. Ensuite, nous entrons dans des situations où l'initialisation de la variable est non trivial, et la raison pour laquelle le développeur n'a pas à faire au point de déclaration a été il/elle a besoin pour effectuer une certaine opération, puis de les céder.

Alors maintenant, nous avons la situation que le compilateur a ajouté un supplément d'instruction pour le code qui initialise la variable à NULL puis, plus tard, le développeur code est ajouté pour faire l'initialisation correcte. Ou dans d'autres conditions, la variable est potentiellement jamais utilisé. Beaucoup de développeurs C++ crier sous le coup de ces deux conditions, au prix de ce supplément d'instruction.

C'est pas juste une question de temps. Mais aussi de l'espace. Il y a beaucoup d'environnements où les ressources sont limitées, et les développeurs ne veulent pas abandonner.

MAIS: Vous pouvez simuler l'effet de forcer l'initialisation. La plupart des compilateurs de vous avertir sur les variables non initialisées. J'ai donc toujours tourner mon niveau d'alerte au plus haut niveau possible. Puis de dire au compilateur de traiter tous les avertissements comme des erreurs. Dans ces conditions, la plupart des compilateurs va alors générer une erreur pour les variables qui sont utilisés ou non et ainsi prévenir le code généré.

42voto

John Points 12438

Citant Bjarne Stroustrup dans TC ++ PL (Édition spéciale p.22):

L'implémentation d'une fonctionnalité ne doit pas imposer de frais généraux importants aux programmes qui n'en ont pas besoin.

21voto

Keats Points 8938

Parce que l'un des piliers du C ++ est:


Vous ne payez pas pour ce dont vous n'avez pas besoin


Pour cette raison, le operator[] du vector classe ne vérifie pas si l'index est hors des limites, par exemple.

12voto

AraK Points 38702

Pour des raisons historiques, principalement parce que c’est comme cela que c’est fait dans C. C’est une autre question, mais je pense que le principe de la surcharge zéro était en quelque sorte impliqué dans cette décision de conception.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X