Bonjour
Je vous fais part d'un bug que je pensais, naïvement, impossible à obtenir.
Terminaison brutale d'un programme avec l'erreur Appel à une fonction virtuelle pure.
Première réaction d'étonnement : Comment appeler une fonction virtuelle pure d'un objet qu'on a même pas pu instancier ?
Après analyse, il s'agit bien d'une instance d'objet dérivé et la backtrace m'indique que le problème survient dans le destructeur de la classe mère.
Là effectivement, c'est plus clair. La couche de la classe dérivée vient d'être détruite et la vtable m'oriente vers une impasse.
Dans mon cas, il ne s'agissait pas d'un appel explicite à la fonction virtuelle depuis le destructeur. C'eût été trop simple.
Cette hiérarchie de classes contient des éléments d'IHM et la classe mère possède un conteneur de widgets.
Or, ces widgets lèvent des événements lorsqu'ils sont sélectionnés, connectés à cette foutue fonction virtuelle.
Lors de la destruction de la classe mère, la destruction des membres entraîne la destruction du conteneur de widgets… qui entraîne la destruction des widgets un par un.
Lors de la destruction du widget sélectionné, il y a sélection automatique du widget suivant, levée d'événement, appel de fonction virtuelle pure => Crack Boom.
Partager