[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [résolu] Re: [HS] Re: Un bug dans la STL ?



Dans un message du 29 Apr à 22:41, Pierre THIERRY écrivait :
> > Tu dois retourner une *référence* sur ton Dice pas un nouvel objet. En
> > effet, tu vas créer des objets temporaires (un par appel a <<) qui
> > référencent le même vecteur.
> 
> Non, car ayant surdéfini l'opérateur =, il n'y a pas de copie
> superficielle.

Nan ca n'est rien a voir.  Quand tu retournes un objet par valeur, le
constructeur par recopie est appele (sauf si ton compilateur peut
utiliser la "return value optimization, mais ce n'est pas le cas ici) et
pas l'operateur d'assignement qui n'est appele que pour les objets
*deja* construits.

exemple:
A a;
A aa = a; // appelle le cteur par recopie et pas operator=
A aaa(a); // pareil
aa = a;   // appelle operator= car aa deja construit

> Néanmoins, merci de la remarque, c'est corrigé. Le problème venait
> probablement du fait que mon constructeur de recopie ne créait pas le
> vecteur, en fait. C'est corrigé, et cette partie du code fonctionne
> désormais, semble-t-il.

Ca ne changera pas le schmilblick.  Ta chaine d'appel de l'operator <<
ne fonctionnera pas comme prevu si tu ne renvoies pas une *reference*.
Sinon tu vas creer des objets temporaires a la chaine et ton objet de
depart ne sera appele que la premiere fois.

Pourquoi crois-tu que tous les operateurs <<,  >> et = standards
renvoient des references?

De plus, tu dois aussi dupliquer les objets pointes sinon quand tu fais
une copie d'un Dice, sinon la destruction d'un des objets va invalider
l'autre (sauf si tu laisses la memoire fuir).

> Par contre, je suis tombé sur troisième bug dans mon code, et je suis
> effaré que le compilo soit passé outre :
> 
> template<class T> Dice & operator =(const T &)
> {
> 	m_rollable_scalars->clear();
> 	this->append(value);
> 	return *this;
> }
> 
> value aurait du être l'identifiant de l'argument, mais j'avais oublié,
> une fois que j'ai décidé d'en faire une fonction template définie dans
> le fichier d'en-tête, de le rajouter dans ce qui était le prototype.
> 
> C'est un bug dans GCC, ou c'est parce que c'était une fonction
> template ?

C'est parce que le compilateur n'est pas oblige d'instancier ton
template lors de sa declaration (et en pratique peu de compilateurs le
font).  Ton code ne l'instanciant jamais le compilateur ne t'a pas donne
d'erreur. (C'est au passage la preuve que ce que je te disais dans mon
precedent message est vrai).

Au passage, ton operateur= ne fonctionne pas correctement pour
l'aliasing. (Si je me souviens bien, c'est le cas de tous tes operateurs
d'assignement).

Ta methode elements() retourne une copie du vecteur de pointeurs donc
n'importe quel client de ta classe peut appeler delete sur les pointeurs
et donc faire planter le programme.

-- 
Guillaume Morin <guillaume@morinfr.org>

        Justice is lost, Justice is raped, Justice is done. (Metallica)



Reply to: