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 ?

Pourquoi un appel de fonction non virtuelle réussit-il sur un pointeur NULL alors qu'un appel de fonction virtuelle échoue ?

Susan Sarandon
Libérer: 2025-01-03 20:43:41
original
511 Les gens l'ont consulté

Why Does a Non-Virtual Function Call Succeed on a NULL Pointer While a Virtual Function Call Fails?

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

É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!

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