Access Violation sur Destructeur

Clonk Messages postés 278 Date d'inscription mardi 22 janvier 2002 Statut Membre Dernière intervention 29 août 2006 - 3 août 2004 à 16:35
Clonk Messages postés 278 Date d'inscription mardi 22 janvier 2002 Statut Membre Dernière intervention 29 août 2006 - 4 août 2004 à 10:26
Bonjour,
j'utilise 4 classes : Champs et Contrainte contenus dans Catégorie, contenue dans Type (tout le monde suit?)

Pour gérer le contenant de chaque classe, j'ai utilisé des listes chainées (okd school, mais ça marche nikel)
je n'ai aucun problème à l'initialisation, mais au moment de la destruction, j'ia un problème au niveau de champ et de contrainte, j'ai un access violation dès que je veux supprimer une valeur d'une des instances. Voilà mes destructeurs:
Type::~Type()
{
cout<<"Lancement du destructeur de Type"<<_debutmasque<<endl;
delete[] _debutmasque;
delete[] _limit;
Lcategorie * ltete	= _lcategorie;
Lcategorie * tmp	= NULL;
while (ltete != NULL)
{
tmp = ltete->suivant;
ltete->_categorie.~Categorie();
ltete = tmp;
}
free(_lcategorie);
int i = 5;
}

Categorie::~Categorie()
{
cout<<"Lancement du destructeur de categorie "<<_masque<<endl;
delete[] _masque;
Lchamps * tetec = _lchamps;
Lchamps * tempc = NULL;
Lct * tetelct = _lct;
Lct * tempct = NULL;
while (tetec != NULL)
{
//if (tetec->suivant!=NULL)
tempc = tetec->suivant;
tetec->_champ.~Champ();
tetec = tempc;
}
while (tetelct != NULL)
{
//if (tetelct->suivant != NULL)
tempct = tetelct->suivant;
tetelct->ct.~Contrainte();
tetelct = tempct;
}
};

Champ::~Champ()
{
cout<<"Lancement du destructeur de Champ "<<_nomchamp<<endl;
delete[] _nomchamp;
delete[] _type;
delete[] _format;
delete[] _separator;
delete[] _explication;
}

Contrainte::~Contrainte()
{
cout<<"Lancement du destructeur de contrainte "<<Ct<<endl;
delete[]Ct;
delete[]_explication;
}


Je vous préviens, je n'ai aucun destructeur qui se lance PENDANT le traitement, uniquement à la fin de mon main.

Merci ;)

4 réponses

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
3 août 2004 à 19:16
probleme de logique et de comprehension, depuis quand on appel explicitement un destructeur ?

tu melange aussi free et delete (ou alors delete[]??)

essay d'avoir un code coherent et surtout revoi les bases de la poo
0
cs_imanewin32 Messages postés 70 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 12 août 2004
3 août 2004 à 19:56
dans ~Type():si _debutmasque n'est pas un tableau d'elt c'est pas la peine de mettre[] la même chose pour _limit
et pour ltete tu doit allouer sinon il va pointé sur le même emplacement que _lcategorie(même valeur)
donc qd tu essaye de détruire ltete tu agit egalement sur _lcategorie

c'est une possiblité!!!!!
car ton code est un peu compliqué
sinon revoit ton code ligne par ligne ,et tu trouvera surement la reponse
Bonne chance
0
Clonk Messages postés 278 Date d'inscription mardi 22 janvier 2002 Statut Membre Dernière intervention 29 août 2006
4 août 2004 à 10:04
Bon, j'ai "un peu" revu mon code, surtout pour la relecture, mais j'ai toujours ce problème...
Je n'ai aucun problème au niveau des destructeurs de Type et Categorie, aucun non plus au niveau de mes listes chainées, c'est au niveau de la destruction de mes char * dans Champs et Contrainte.
djl : Oui, je mélangeais free et delete, je suis torp habitué à faire du C, et pas du C++, donc G mélangé.
Voilà, C ptete légèrement plus compréhensible:
Type::~Type()
{
delete[] _debutmasque;
delete[] _limit;
Lcategorie * ltete	= _lcategorie;
Lcategorie * tmp	= NULL;
while (ltete != NULL)
{
tmp = ltete->suivant;
delete ltete;
ltete = tmp;
}
}

Categorie::~Categorie()
{
delete[] _masque;
Lchamps * tetec = _lchamps;
Lchamps * tempc = NULL;
Lct * tetelct = _lct;
Lct * tempct = NULL;
while (tetec != NULL)
{
tempc = tetec->suivant;
delete tetec;
tetec = tempc;
}
while (tetelct != NULL)
{
tempct = tetelct->suivant;
delete tetelct;
tetelct = tempct;
}
}

Champ::~Champ()
{
delete[] _nomchamp;
delete[] _type;
delete[] _format;
delete[] _separator;
delete[] _explication;
}

Contrainte::~Contrainte()
{
delete[]Ct;
delete[]_explication;
}


Note : tous mes "delete[]" sont sur des char* que j'ai alloué en new char [val].

Et ça ne me fait un access violation UNIQUEMENT sur les char* dans Champs et Contrainte.

Je capte toujours pas!
0
Clonk Messages postés 278 Date d'inscription mardi 22 janvier 2002 Statut Membre Dernière intervention 29 août 2006
4 août 2004 à 10:26
Cbon, j'ai capté, CT meme pas dans les destructeurs, je n'avais pas sorrigé les constructeurs de ces classes, c'est tout...
Mais sinon, mes destructeurs, mal fait, certes, marchaient très bien ^_^
Meric du coup de main
0
Rejoignez-nous