11
votes

Qu'est-ce qui peut causer un pointeur à usage virtuel 0xDDDDDDDDD dans Win32 Debug Build?

Je déboguise un défaut et je l'ai réduit au pointeur Table pour un objet étant 0xDDDDDDDDDD code>. Cette réponse indique que les constructions de débogage Win32 définiront généralement la mémoire morte ou la mémoire qui a été supprimée, à cette valeur spéciale.

Notez que le pointeur est valide , c'est juste le pointeur de fourble fort> qui est 0xdddddddd code>. p>

Voici un extrait de code: p>

std::list<IMyObject*>::const_iterator it;
for (it = myObjects.begin(); it != myObjects.end(); ++it)
{
    IMyObject* pMyObject = *it;
    if (pMyObject == 0)
        continue;

    pMyObject->someMethod(); // Access violation     
}


1 commentaires

Cela ressemble à un cas classique de quelqu'un en supprimant l'objet après avoir mis le pointeur dans la liste. Êtes-vous sûr que ce n'est pas le cas (il peut être supprimé d'une autre fonction après avoir rempli la liste, de jeter un coup d'œil sur la pile d'appel peut ne pas être beaucoup d'aide). La chose la plus simple à essayer est de mettre un point d'arrêt dans le destructeur de imyObject et de voir que quelqu'un supprime l'objet.


4 Réponses :


12
votes

Vous utilisez le pointeur après sa libération. Obtenez une trace de pile d'un point d'arrêt dans le destructeur pour voir ce qui la supprime. Ou mieux encore, utilisez Shared_PTR <> pour éviter le problème.


3 commentaires

Merci, ces objets sont créés / détruits des milliers de fois, cela pourrait donc être difficile (même pas sûr d'un point d'arrêt conditionnel aidera parce que je ne suis pas sûr de la condition). Mais je vais commencer à enquêter.


Vous recherchez un cas où l'objet est supprimé sans que le pointeur soit retiré de la liste, ni un cas où un objet pourrait être inséré dans la liste plus d'une fois, mais seulement supprimé de la liste une fois sur la suppression.


@LeopardskinPillboxHat: ... ou un cas où l'objet est ajouté à la liste, puis supprimé en dehors de la liste. L'approche simple évite d'éviter les pointeurs bruts et stocke l'un des pointeurs intelligents disponibles ( qsharedpointer pourrait être un bon candidat).



1
votes

Si vous démarrez le programme, mettez un point de rupture à l'endroit où vous créez l'objet. Ajoutez ensuite un point de rupture de mémoire. Cela incendiera si vous écrasez ou supprimez la mémoire. Bien, ou changez-le de quelque manière que ce soit.

Votre objet aura l'air correct si la mémoire n'est pas écrasée, mais votre tablevissible peut ne pas dépendre des spécificités du compilateur.

Cela pourrait également être un problème de taille si vous utilisez l'héritage. Si vous utilisez une sorte de mémoire de seau ou que vous enregistrez des objets, tout sauf le pointeur.


0 commentaires

1
votes

Si pmyObject-> SOMEMETHOD () finit par modifier la liste MyObjects, il invalidera l'un des itérateurs actuels.

En outre, si les données du pointeur sont déjà supprimées, cela déclenchera le même problème.


1 commentaires

Ahh, Itérateurs non valides! N'avait pas pensé à ça.



1
votes

Ok wow, donc j'ai été la programmation en C ++ depuis des années et n'a jamais découvert jusqu'à ce que maintenant ... Il y a en fait nombres magiques / magiques valeurs de débogage que vous pouvez rechercher pour voir ce qui se passe avec vos pointeurs premières pendant le débogage!

Voir ici: Dans Visual Studio C ++, ce sont les représentations d'allocation de mémoire?

et ici: https://en.wikipedia.org/wiki/Magic_number_ (programmation) #Magic_debug_values ​​


0 commentaires