Je programme en C++ sous VS2005.
J'ai un pb d'allocation de ma table des méthodes (il me semble):lorsque j'appel un méthode depuis un pointeur vers un objet, le programme se dirige vers une AUTRE méthode!!!
Elle n'ont aucun rapport entre elles (nom,pas d'héritage,...).
Le programme m'a fait cette erreur a 2 endroits différents dans le code.
Problèmes de heap?
Comment débugger?
Puis je voir l'adresse des méthodes qlq part?
Les méthodes qui posent problèmes sont déclarées virtuelles dans une parente ?
Le principe des vtable est généralement assez simple : chaque instance de l'objet balade un pointeur sur une vtable qui est utilisée par toutes les instances d'une classe. Lors de l'appel d'une méthode, le processeur execute l'adresse qui se trouve à un certains offset dans la vtable pointé par l'objet.
|pointeur sur l'objet -> |vtable -> adresse de la fonction à executer.
|offset dans la vtable |offset dans la vtable
Débuguer en langage machine te permettrait de comprendre d'où vient le problème. L'assembleur est un langage très simple, mais c'est vrai que pour celui qui en a jamais fait...
En VC2005 ou n'importe quelle ide, comme tu le disais c'est juste un pointeur possédé par chaque object de la classe. Suffit de lire le contenu du pointeur. Mais le débuggeur VC2005 le fait pour nous. Rien n'est impossible à ce débuggeur :)
Ces réponses m'aident à comprendre le fonctionnement des vtable mais...
En enlevant la méthode vers laquelle le programme pointait de maniere non désiré, une autre erreur est apparu: "Accès violation reading...0xC0000005"!
Ca peu effectivement arriver à n'importe quel moment dans le débogage, en fait à chaque fois que j'arrive à cette adresse (0xC0000005).
J'ai trouvé plusieurs raison à cette "fuite mémoire" ou "refus d'accès" sur le net mais pour l'instant aucune solution à mon problème!
On trouve notament sur internet cette erreur due aux antivirus, au mode débogue, au multithread...
Les 2 problèmes ont l'air d'etre liés (vtable et 0xc0000005): le programme ne trouve pas les méthodes désirés dans la vtable donc pointe n'importe où!
On peut accéder à cette table de méthode sous VS2005 en mode débogue via le pointeur _vfptr (en mettant le curseur de la souris sur un objet possédant des méthodes).
Je tiens ma piste...
Maintenant que je peut voir la vtable, je m'apercois qu'il y manque des méthodes.
De plus certaines sont précédées de [thunk] et le compilo n'a pas l'air de les trouver. Quelqu'un sait ce que cela veut dire? Comment y remédier?