Se connecter avec
S'enregistrer | Connectez-vous
Votre question

Utilisation de vecteur de pointeur de class dérivé C++

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
Partagez
22 Juillet 2006 05:19:21

Bonjour je travail sur un programme qui simule un environnement dans lequel évolue des fourmis.

J'ai une classe qui gére le jeu appelé GM
Pour gérer la population de fourmis je les empile dans un vecteur.
Je gére de la même facon une population de nourriture.
Puis pour un algo interne j'ai de besoin d'un vecteur de int.

Je saute plusieurs truc par élimination je crois que mon problème est a ce niveau mais si j'en donne pas assez n'hésitez pas.

class GM
{
public:
vector< CAnts * > m_vpAnts;
vector< CFood * > m_vpFood;
vector< int > m_vnDeadAntsID;
{

si je mets la déclaration de Food en commentaire je n'ai pas de problème. "Si je veux me servir de food, je n'ai qu'a mettre m_vnDeadAntsID en commentaire." Par contre si je me sert de food, le programme fonctionne comme il faut par contre en quittant le debug ouvre dbgdel.cpp et tombe en erreur.
Voici ce qui affiche:
Unhandled exception at 0x00445278 in Animants.exe: 0xC0000005: Access violation reading location 0xcdcdcdc1.

Quelque info générale:
Compilation sur Visual Studio 2003 .net

Ants est dérivé de Entity tout comme Food

le vecteur ants ne contient pas de ants mais des class dérivé de Ants

dans le destructeur de GM j'ai les fonctions

if( ! m_vpAnts.empty() )
{
m_vpAnts.clear();
}

pour chaque vecteur


Parmis les causes possible que j'ai exploré

Food et Ants ne sont pas vide quand je ferme le programme

m_vnDeadAntsID ne contient rien mais j'ai tenter de lui mettre des element et ca n'as pas regler le trouble

J'ai vidé complêtement (/*en mettant en commentaire*/) les class CAnts et CFood pour seulement les déclarés et n'avoir aucune référence a eux dans le programme et ca n'as rien changer.

Je ne suis pas un pro en prog je commence a me débrouiller (intermédiaire) mais il y a surement quelque chose qui m'as échapper.

Merci d'avance je me demande s'il n'y aurait pas des restrictions sur les vecteurs que l'on peut créer dans une classe (example 2 max). Je peux donner plus de détail mais à mon avis la source du problème est dans ma facon de faire (j'ai p-e oublier quelque chose) en réalité le vecteur m_vpAnts ce n'est pas moi qui l'ai créer, c'est mon coéquipier et moi j'ai regardé comment il avait fait pour faire le vecteur food.

Autres pages sur : utilisation vecteur pointeur class derive

22 Juillet 2006 12:18:53

Un crash à la fermeture, c'est très classiquement 2 delete qui sont faits.

Je pense que dans ton cas c'est légèrement différent.
Citation :
Unhandled exception at 0x00445278 in Animants.exe: 0xC0000005: Access violation reading location 0xcdcdcdc1.

Sur le message on remarque que quelque part tu essaie de lire un pointeur qui pointe à l'adresse 0xcdcdcdc1.
Par expérience, on remarque que lorsque visual libère de la mémoire, il met des valeurs génériques (qui est très souvent une suite d'octet CD ... CD).
C'est ton cas ici. Donc, quelque part, un delete a été effectué sur un pointeur de pointeur (ce qui conviendrait parfaitement à un vector).
Ensuite, tu essaie de lire (ou de détruire) un objet du vector qui a déjà été détuit.
Ceci peut généralement se voir en mettant des points d'arrêts dans tous les destructeurs.

Je te conseille donc de vérifier:
1. tout possible accès à ton vector après son clear()
2. qu'aucun pointeur pointant sur un objet du vecteur n'est détruit
3. (avec 2.) qu'aucun objet du vecteur ne détruit un autre objet du vecteur.

Classiquement, ça se produit, lorsqu'on fait une liste d'objet, et que d'autres objets extérieurs contiennent des pointeurs sur un (ou plusieurs) objet de la liste. Dans ce cas, il faut penser à ne pas faire de delete sur le pointeur.
Après ça peut être plus tordu avec des pointeur qui pointent sur des pointeurs qui pointent...
25 Juillet 2006 17:11:43

Merci beaucoup grace a ce que tu m'as dit j'ai pu identifier ou étais le bug et le regler. c'etais le delete du pointeur de ma classe de controle qui n'étais pas a la bonne place dans la main. Merci encore et j'prend note de ton truc CD CD
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS