Je déboguise un défaut et je l'ai réduit au pointeur Table pour un objet étant Notez que le pointeur Voici un extrait de code: p> 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.
0xdddddddd 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
}
4 Réponses :
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. P>
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 code> pourrait être un bon candidat).
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. P>
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. P>
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. P>
Si pmyObject-> SOMEMETHOD () finit par modifier la liste MyObjects, il invalidera l'un des itérateurs actuels. P>
En outre, si les données du pointeur sont déjà supprimées, cela déclenchera le même problème. P>
Ahh, Itérateurs non valides! N'avait pas pensé à ça.
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 strong> que vous pouvez rechercher pour voir ce qui se passe avec vos pointeurs premières pendant le débogage! p>
Voir ici: Dans Visual Studio C ++, ce sont les représentations d'allocation de mémoire? p>
et ici: https://en.wikipedia.org/wiki/Magic_number_ (programmation) #Magic_debug_values p>
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 code> et de voir que quelqu'un supprime l'objet.