52 votes

Accès aux membres d'une classe sur un pointeur NULL

Je faisais des expériences avec C++ et j'ai trouvé le code ci-dessous très étrange.

class Foo{
public:
    virtual void say_virtual_hi(){
        std::cout << "Virtual Hi";
    }

    void say_hi()
    {
        std::cout << "Hi";
    }
};

int main(int argc, char** argv)
{
    Foo* foo = 0;
    foo->say_hi(); // works well
    foo->say_virtual_hi(); // will crash the app
    return 0;
}

Je sais que l'appel à une méthode virtuelle se plante parce qu'il nécessite une consultation de la table virtuelle et ne peut fonctionner qu'avec des objets valides.

J'ai les questions suivantes

  1. Comment la méthode non virtuelle *say_hi* fonctionne-t-elle sur un pointeur NULL ?
  2. Où l'objet foo est alloué ?

Des idées ?

2voto

Uri Points 50687

L'appel à say_hi est lié statiquement. L'ordinateur effectue donc simplement un appel standard à une fonction. La fonction n'utilise aucun champ, il n'y a donc aucun problème.

L'appel à virtual_say_hi est lié dynamiquement, donc le processeur va à la table virtuelle, et comme il n'y a pas de table virtuelle à cet endroit, il saute quelque part au hasard et fait planter le programme.

1voto

Tommy Hui Points 1055

À l'origine du C++, le code C++ a été converti en C. Les méthodes objet sont converties en méthodes non-objet comme ceci (dans votre cas) :

foo_say_hi(Foo* thisPtr, /* other args */) 
{
}

Bien sûr, le nom foo_say_hi est simplifié. Pour plus de détails, consultez C++ name mangling.

Comme vous pouvez le voir, si le thisPtr n'est jamais déréférencé, alors le code est correct et réussit. Dans votre cas, aucune variable d'instance ou quoi que ce soit qui dépende du thisPtr n'a été utilisé.

Cependant, les fonctions virtuelles sont différentes. Il y a beaucoup de recherches d'objets pour s'assurer que le bon pointeur d'objet est passé comme paramètre à la fonction. Cela déréférencera le thisPtr et provoquera l'exception.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X