Maison > développement back-end > C++ > Pourquoi l'appel d'une méthode non virtuelle sur un pointeur NULL n'entraîne-t-il pas un comportement indéfini ?

Pourquoi l'appel d'une méthode non virtuelle sur un pointeur NULL n'entraîne-t-il pas un comportement indéfini ?

Susan Sarandon
Libérer: 2024-12-31 18:44:13
original
248 Les gens l'ont consulté

Why Does Calling a Non-Virtual Method on a NULL Pointer Not Result in Undefined Behavior?

Accès aux membres de classe sur un pointeur NULL

Bien qu'elle ait été déclarée comme pointeur vers une instance de type Foo, la variable foo est initialisée à 0, ce qui en fait un pointeur nul. Cela peut sembler contre-intuitif, car l'accès aux membres d'un pointeur nul est généralement un comportement indéfini. Cependant, certaines circonstances autorisent ce comportement.

Invocation de méthode non virtuelle

La méthode non virtuelle say_hi() est invoquée avec succès malgré le pointeur nul car elle n'est pas une méthode virtuelle. Les méthodes virtuelles nécessitent un objet valide pour déterminer quelle fonction appeler en fonction du type de l'objet. Les méthodes non virtuelles, en revanche, ont une adresse de fonction prédéterminée que le compilateur utilise pour générer une instruction d'appel de fonction directe.

Plus précisément, le compilateur génère un code équivalent au suivant :

void Foo_say_hi(Foo* this);
Foo_say_hi(foo);
Copier après la connexion

Puisque la fonction say_hi() ne fait pas référence au pointeur this, elle évite le besoin de déréférencer un pointeur potentiellement nul. pointeur.

Allocation d'objet

La variable foo est une variable locale au sein de la fonction principale, elle est donc allouée sur la pile de la fonction. En tant que variable de pointeur, l'objet réel vers lequel elle pointe n'est pas alloué ici. La valeur nulle indique que le pointeur ne fait pas référence à un objet valide.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal