Access Violation sur Destructeur

Signaler
Messages postés
278
Date d'inscription
mardi 22 janvier 2002
Statut
Membre
Dernière intervention
29 août 2006
-
Messages postés
278
Date d'inscription
mardi 22 janvier 2002
Statut
Membre
Dernière intervention
29 août 2006
-
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

Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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
Messages postés
71
Date d'inscription
mardi 30 mars 2004
Statut
Membre
Dernière intervention
12 août 2004

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
Messages postés
278
Date d'inscription
mardi 22 janvier 2002
Statut
Membre
Dernière intervention
29 août 2006

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!
Messages postés
278
Date d'inscription
mardi 22 janvier 2002
Statut
Membre
Dernière intervention
29 août 2006

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