Gotcha en C : accéder aux membres de classe non virtuels sur un pointeur nul
En C, appeler des fonctions de membres non virtuels sur un pointeur nul le pointeur peut fonctionner de manière inattendue, posant un curieux casse-tête. Examinons ce comportement à travers un extrait de code intrigant :
class Foo { public: virtual void say_virtual_hi() { std::cout << "Virtual Hi"; } void say_hi() { std::cout << "Hi"; } }; int main() { Foo* foo = 0; foo->say_hi(); // Works well foo->say_virtual_hi(); // Crashes the app return 0; }
Puzzle expliqué
La confusion vient des différents mécanismes utilisés pour appeler des méthodes virtuelles et non virtuelles. .
Dans le code donné, la méthode non virtuelle say_hi() ne déréférence jamais explicitement le this pointeur, contournant l’erreur de déréférencement du pointeur nul. C'est essentiellement l'équivalent d'un appel de fonction avec un paramètre passé par valeur :
void Foo_say_hi(Foo* this); Foo_say_hi(foo);
Comportement non défini
Techniquement, appeler n'importe quelle fonction (même non virtuelle) sur un pointeur nul est un comportement indéfini en C . Cependant, certaines implémentations du compilateur peuvent fournir un comportement bien défini pour des scénarios spécifiques, tels que l'appel de fonction non virtuelle ci-dessus.
Attention
Bien que le comportement inattendu puisse sembler pratique, s’y fier est risqué et n’est pas une bonne pratique. Évitez toujours d'accéder aux membres de la classe sur des pointeurs nuls, car cela peut conduire à des résultats inattendus et imprévisibles.
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!