Quand l'invocation d'une fonction membre d'une instance null entraîner un comportement non défini?

Considérons le code suivant:

#include <iostream>

struct foo
{
    //(a):
    void bar() { std::cout << "gman was here" << std::endl; }

    //(b):
    void baz() { x = 5; }

    int x;
};

int main()
{
    foo* f = 0;

    f->bar(); //(a)
    f->baz(); //(b)
}

Nous nous attendons à ce (b) de crash, car il n'y a pas de membre correspondant x pour le pointeur null. Dans la pratique, (a) ne tombe pas en panne parce que le this pointeur n'est jamais utilisé.

Parce que (b) déréférence le this pointeur ((*this).x = 5;), et this est null, le programme entre dans un comportement indéfini, comme référence à la valeur null est toujours dit d'être un comportement indéfini.

Ne (a) entraîner un comportement non défini? Si les deux fonctions (et x) sont statiques?

  • Si les deux fonctions sont statiques, comment pourrait-x être appelé à l'intérieur de baz? (x est un non-variable membre statique)
  • Faire semblant x a été faite trop statique. 🙂
  • Sûrement, mais pour le cas (a), il fonctionne de la même dans tous les cas, je.e, la fonction est appelée. Cependant, le remplacement de la valeur du pointeur de 0 à 1 (par exemple, par le biais de reinterpret_cast), c'est presque invariablement se bloque toujours. La valeur de l'allocation de 0 et donc NUL, comme dans le cas a, représente quelque chose de spécial pour le compilateur ? Pourquoi faut-il toujours bloquer avec toute autre valeur attribuée à elle?
  • Intéressant: Venez à la prochaine révision du C++, il n'y aura pas plus d'un déréférencement de pointeurs à tous. Nous allons maintenant effectuer indirection via des pointeurs. Pour en savoir plus, veuillez effectuer indirection par le biais de ce lien: N3362
  • Whoa! C'est tout un changement.
  • L'invocation d'une fonction membre sur un pointeur null est toujours un comportement indéfini. Juste en regardant ton code, je peux déjà sentir le comportement non défini rampant lentement jusqu'à mon cou!

InformationsquelleAutor GManNickG | 2010-03-18