Maison > développement back-end > C++ > Pourquoi les appels de méthodes non virtuelles sur des pointeurs nuls évitent-ils parfois les plantages en C ?

Pourquoi les appels de méthodes non virtuelles sur des pointeurs nuls évitent-ils parfois les plantages en C ?

DDD
Libérer: 2024-12-14 09:29:12
original
837 Les gens l'ont consulté

Why Do Non-Virtual Method Calls on Null Pointers Sometimes Avoid Crashes in C  ?

Appels de méthodes non virtuelles et pointeurs nuls : un paradoxe

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é ?

Comprendre les appels de méthodes non virtuelles

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();
Copier après la connexion

Le compilateur transforme cela en :

void Foo_say_hi(Foo* this);

Foo_say_hi(foo);
Copier après la connexion

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.

Comportement non défini et optimisation du compilateur

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.

Allocation d'objet

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal