Imaginons un instant deux méthodes de deux classes ainsi définies :

void SomeClass::someFunc()
{
  if (...) {
    // member est une variable d'instance du type pointeur sur un objet de type SomeOtherClass
    member->someOtherFunc();
  } else  {
    ....
  }
}

void SomeOtherClass::someOtherFunc()
{
  // anotherMember est ici une variable d'instance de type int
  if (anotherMember == 42) {
    ...
  }
}

Soit l'appel suivant de cette méthode:

void func(SomeClass *cp)
{
  ...
  cp->someFunc();
  ...
}

Imaginons encore que, suite à une erreur, le pointeur cp n'ait pas été correctement initialisé et qu'il vale, lors de cet appel, 0. Il est clair que nous sommes bons pour une erreur de segmentation et je croyais jusqu'à il y a peu que celle-ci apparaîtrait lors de l'appel de cette méthode. De fait cette erreur apparaît bien mais pas sur l'appel lui-même.

Ce qui se passe ici est que lors de l'appel à SomeClass::someFunc() l'exécution part dans le code de cette fonction quelque soit la valeur de cp car ce code est bien sûr commun à toutes les instances. Le fait que cp soit nul passe (pour l'instant) inaperçu puisque cp n'a pour l'instant pas encore été déréférencé (seule sa valeur est passée en paramètre interne à someFunc()). Ensuite (nous admettons que le if (...) retourne une valeur vraie) l'exécution va se poursuivre dans le code de SomeOtherClass::someOtherFunc() pour les mêmes raisons et c'est seulement lors du test sur la variable d'instance anotherMember que l'erreur de segmentation va être levée puisque évidemment cette variable n'est pas initialisée. C'est donc sur cette ligne que s'arrêtera le débogueur alors que l'erreur se trouve, dans le code, bien avant.

En résumé, il ne faut donc pas présumer qu'un appel du type cp->someFunc() génèrera une erreur immédiate si cp est nul.

Merci à Nicolas Souchon du forum de QtFr pour m'avoir mis sur la voie et pour la précision apportée au sujet des méthodes virtuelles qui, elles, de par le besoin de déréférencer this pour accéder à la table des méthodes virtuelles, ne sont pas sujettes à ce type de comportement.