STL operateur= et constructeur par recopie

bebert37 Messages postés 38 Date d'inscription jeudi 17 juillet 2003 Statut Membre Dernière intervention 16 février 2005 - 18 juil. 2003 à 10:39
bebert37 Messages postés 38 Date d'inscription jeudi 17 juillet 2003 Statut Membre Dernière intervention 16 février 2005 - 21 juil. 2003 à 15:04
Salut
c'est l'histoire d'un probleme bizarre (les voies de l'informatique sont impenetrables )
J'ai un objet RdP avec son constrcucteur par recopie et une surcharge d'operateur=
Cet objet contient 2 Listes (STL)(LTrans,LPlace). Je veux donc les recopiers dans les 2 cas. Lorsque les deux listes sont recopiees, une autre fonction se met a buguer (Descript()) qui decrit la classe RdP sous la forme d'un string !!! Pour construire ce string j'utilise des methodes Get&Set de mon objet RdP
Je pense que le probleme viens de là puisque si je n'utilise ni la surcharge = ni le constructeur par recopie dans le main() la fonction descript() ne bugue pas.
C'est bizarre non ...
si quelqu'un a une idée ???
merci .
(voici le code )
RdP::RdP(const RdP& o){
Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
strcpy(Nom,o.Nom);
/* je recopie les listes ici */
LPlace = o.LPlace;
LTrans = o.LTrans;
}

RdP RdP::operator=(const RdP& o){
Nom = (char*) malloc(sizeof(char)*strlen(o.Nom));
strcpy(Nom,o.Nom);
/* et la */
LPlace = o.LPlace;
LTrans = o.LTrans;

return *this;
}

string RdP::Descript(){

std::string Chaine;
list::iterator p;
list<TransTemp>::iterator t;
Chaine = "Reseaux de Petri : ";
Chaine = Chaine + Nom;

/* recapitulation des Places */
if(LPlace.empty() != true){
p = LPlace.begin();
/* Le Probleme arrive ici */
// lorsqu'on debug ..... BAM ça saute là
// alors que sous le debugger on a acces aux elements du RdP
// on dirait que l'affectation de la chaine bugue à cet endroit précis quoi qu'on fasse

Chaine += p->GetNom();
p++;
while(p != LPlace.end()){
Chaine = Chaine + ":";
Chaine = Chaine + p->GetNom();
p++;
}
}
.......

5 réponses

cs_Kaid Messages postés 949 Date d'inscription mardi 2 octobre 2001 Statut Membre Dernière intervention 8 juillet 2006 1
18 juil. 2003 à 14:41
- Dans le constructeur, tu alloues de l'espace pour une chaine de caractères mais tu oublies un caractère pour le '\0' final.

- Même erreur dans l'opérateur d'affectation. De plus, si le membre Nom de la classe pointe déjà sur quelque chose, il faudrait le libérer pour éviter les fuites mémoires.

- Quel est le type de ce que tu stockes dans les std::list ?

Kaid - kaid.fr.st
0
bebert37 Messages postés 38 Date d'inscription jeudi 17 juillet 2003 Statut Membre Dernière intervention 16 février 2005
21 juil. 2003 à 09:31
Merci bien pour ton aide precieuse.
c'est une erreur banale et je m'y suis laissé prendre.

Pour ce qui est du type des listes il s'agit d'objets Translation et Places qui sont eux même composés de listes d'objets Arcs, qui pointent sur un objet Place ou Transition suivant le cas. C'est un structure un peu bizarre mais c'est comme ça que sont fait les reseaux de Petri.

Bebert
0
bebert37 Messages postés 38 Date d'inscription jeudi 17 juillet 2003 Statut Membre Dernière intervention 16 février 2005
21 juil. 2003 à 11:47
J'ai effectué tous les changements qui s'imposaient malgres cela le probleme persiste.
J'ai remarquer que si j 'enlevai les lignes dans le constructeur par recopie et dans la surcharge d'operateur :
LTrans= o.LTrans
LPlace = o.LPlace

La recopie des liste ne se fait plus : on n'a plus d'erreur mais malheureusement nos listes ne sont alors plus recopiées.
Comment éviter ce probleme ???
0
cs_Kaid Messages postés 949 Date d'inscription mardi 2 octobre 2001 Statut Membre Dernière intervention 8 juillet 2006 1
21 juil. 2003 à 14:18
Dans les listes STL, le type du template est un objet ou un pointeur vers un objet ?

Kaid - kaid.fr.st
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bebert37 Messages postés 38 Date d'inscription jeudi 17 juillet 2003 Statut Membre Dernière intervention 16 février 2005
21 juil. 2003 à 15:04
Ce sont des objets qui composent les listes.
0
Rejoignez-nous