Maison >développement back-end >C++ >Pourquoi un appel de fonction non virtuelle réussit-il sur un pointeur NULL alors qu'un appel de fonction virtuelle échoue ?
Accès aux membres de la classe sur un pointeur NULL : anomalies et explications
Dans l'extrait de code C fourni, il a été observé qu'un appel de fonction à une méthode non virtuelle a réussi même lorsque le pointeur d'objet était NULL, tandis qu'un appel de fonction virtuelle a provoqué le crash de l'application. Ce comportement curieux soulève deux questions fondamentales :
1. Comment fonctionne une méthode non virtuelle sur un pointeur NULL ?
Contrairement à un appel de fonction virtuelle, un appel de fonction non virtuelle ne nécessite pas de recherche de table virtuelle. Le compilateur traduit directement l'appel de fonction en une instruction de code machine qui pointe vers la fonction spécifique à exécuter. La fonction reçoit un pointeur vers l'objet sur lequel la fonction est appelée en tant que paramètre caché.
Dans le code donné, la fonction say_hi() ne fait aucune référence aux membres de la classe Foo. Par conséquent, il peut être exécuté sans qu’il soit nécessaire de déréférencer le pointeur this. Essentiellement, l'appel à say_hi() équivaut à :
void Foo_say_hi(Foo* this); Foo_say_hi(foo); // where foo is NULL
Étant donné que la fonction ne tente jamais d'accéder aux membres de l'objet, elle ne rencontre pas le comportement indéfini du déréférencement d'un pointeur NULL.
2. Où l'objet foo est-il alloué ?
Dans le code fourni, foo est déclaré comme une variable locale de type Foo*. Puisqu'elle ne bénéficie pas d'une allocation de mémoire spécifique, elle est très probablement allouée sur la pile pour la fonction principale, tout comme les autres variables locales. Cependant, la valeur stockée dans foo est un pointeur NULL, indiquant qu'elle ne pointe pas vers une instance d'objet valide de type Foo.
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!