2009-06-14 7 views
2

Nous avons reçu un vidage sur incident du site du client. Je vois que dans l'une des structures o nstack __vfptr est NUL. Est-ce qu'il pointe toujours vers une condition problématique (dépassement de mème, suppression de l'objet deux fois ...) ou est-ce que ce pointeur peut être nul.__vftptr est NULL

Répondre

1

Alors que généralement la réponse est "oui", je pense que vous devriez considérer que cela pourrait être un problème de débogueur aussi.

+0

Vrai, surtout si vous utilisez du code optimisé. Je peux certainement imaginer que cela se produise si le __vfptr n'est pas en ligne parce qu'il n'est pas utilisé. Un bon optimiseur abandonnera alors l'initialisation redondante. – MSalters

13

Utilisez-vous memset() n'importe où sur les instances de vos classes?

J'ai vu ce problème avant et la cause était le code comme

 
class C : SomeClassWithVirtualFunctions 
{ 
public: 
    C() 
    { 
    memset(this, 0, sizeof (C)) ; // BAD!! sets _vfptr to 0 too 
    } 
} 

cppcheck est propre

0

Normalement, je reçois la corruption VPTR lorsque l'objet a été supprimé deux fois (et oui, il est toujours un bug). La plupart du temps pour moi, le vptr pointe juste vers un bloc de mémoire aléatoire, mais il semble que le vôtre soit écrasé par NULL, ce qui pourrait être l'OS qui efface la mémoire récupérée, ou cela pourrait être un pointeur sur ce qui se passe l'écrasement.

Envisagez d'utiliser boost :: shared_ptr pour conserver une durée de vie de propriété.

1

Cela peut se produire si vous essayez d'obtenir des informations de type au moment de l'exécution (c'est-à-dire utilisez la fonction typeid) sur un objet d'une classe qui n'a pas de fonctions virtuelles.

5

Vous pouvez voir un objet partiellement détruit sur la pile. Le compilateur peut marquer une partie d'un objet comme détruit en effaçant le pointeur de la table de fonction virtuelle, afin qu'il puisse implémenter correctement les destructeurs de classes avec l'héritage "diamond" (héritages multiples des classes qui ont une classe de base virtuelle commune). Pendant la destruction de l'objet, vous verrez l'objet partiellement détruit dans la décharge.

Les anciens compilateurs MSVC n'implémentaient pas correctement les destructeurs pour les classes avec l'héritage de diamant. Chaque fois que vous essayez d'en détruire un, le programme plante. Je ne suis pas sûr que ce soit toujours le cas.

+0

C'est intressant, c'est exactement ce qui se passe. Le programme avec des accidents d'héritage de diamant pendant la destruction. – Boris

+0

Pouvez-vous fournir MS-Link pour le problème? – Boris

+0

Je ne sais pas si MS a déjà documenté le bug. Vous pouvez essayer une recherche Bing! – Nat