L'accès aux membres de la classe via un pointeur nul entraîne généralement un crash. Cependant, en C , certaines méthodes non virtuelles semblent fonctionner même avec des pointeurs nuls. Ce comportement soulève plusieurs questions : comment cela se produit-il et où l'objet est-il alloué ?
En C , lorsqu'une méthode non virtuelle est appelée sur un null pointeur, le compilateur génère un appel direct à la fonction associée à cette méthode. Il le fait en passant un paramètre caché (pointeur vers l'objet) à la fonction.
Dans l'exemple fourni :
class Foo { void say_hi(); }; Foo* foo = nullptr; foo->say_hi();
Le compilateur transforme cela en :
void Foo_say_hi(Foo* this); Foo_say_hi(foo);
Puisque la méthode say_hi ne référence jamais les membres de l'objet, elle ne déréférence pas le pointeur nul et évite ainsi le erreur.
Formellement, appeler n'importe quelle méthode sur un pointeur nul est un comportement indéfini. Cependant, les compilateurs peuvent optimiser le code en supposant que l'objet n'est pas nul. Ceci est risqué car cela peut conduire à un comportement inattendu.
Dans le cas de l'exemple, le compilateur optimise l'appel de méthode non virtuelle pour éviter un crash. Toutefois, il est important de noter que ce comportement n’est pas garanti. L'appel de méthodes non virtuelles sur des pointeurs nuls doit toujours être évité car cela peut conduire à des résultats non spécifiés.
L'objet référencé par le pointeur foo dans l'exemple n'est pas alloué dans le fonction principale. Une variable locale de type Foo* est créée sur la pile et la valeur qui lui est attribuée est un pointeur nul. Cela signifie que l'objet lui-même n'existe nulle part en mémoire.
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!