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

[HS] Re: Un bug dans la STL ?



On 27 Apr 19:09, Pierre THIERRY wrote:
> Je commence par les dés, et je suis tombé sur un os : une de mes
> classes comprend un méthode qui est censée désallouer des objets dont
> les pointeurs sont stockés dans un conteneur de la STL, qui est un
> membre privé de la classe, et vider celui-ci au passage.
> 
> Avec trois types différents, j'obtiens trois bugs différents, l'un très
> grave.

Le problème est
template<class T> Dice operator <<(const T & addendum)
{
    append(&addendum);
    return *this;
}

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. Ils vont tous essayer de le désallouer l'un
après l'autre, d'où le bug.

Si tu change le protype pour retourner une référence:
template<class T> Dice& operator <<(const T & addendum)
tout marchera impec.

Si tu avais conçu ta classe correctement, tu aurais repérer le prb tout
de suite.  Les versions de l'opérateur= et du constructeur par recopie
générés par le compilateur ne sont pas correctes pour l'objet Dice. 
Tu dois donc les écrire toi même si tu veux autoriser la copie d'objet
Dice.  Sinon éclare ces deux méthodes "private".

> Au passage, est-ce que ce n'est pas un bug gravissime dans le noyau
> (probablement dans l'ordonnancement) qu'un plantage pareil puisse
> arriver ?

En effet, ton noyau doit avoir un problème (certainement pas
d'ordonnancement par contre) car aucune tâche utilisateur ne devrait
planter le noyau (si tu lances pas le programme en root et encore dans
ce cas précis, ça ne devrait rien changer).

Je te suggère de mettre à jour ton noyau.  Le mieux ne plante pas
quelque soit le conteneur.

A+

-- 
Guillaume Morin <guillaume@morinfr.org>

                    Sometimes I find I need to scream (RHCP)



Reply to: