Bonsoir,
J'ai un drôle de problème concernant les smart pointers. J'ai une ligne qui pose problème, cette ligne étant :
(*ResultatNEH) = ordo->NEH();
où ResultatNEH est de type boost::shared_ptr<double>. À l'exécution de cette ligne de commande, le débogueur gdb dit : "Program received signal SIGABRT (Aborted)".
Et, bizarre, c'est dans le shared_ptr.hpp que ça plante :
1 2 3 4 5
| reference operator* () const // never throws <-- lol
{
BOOST_ASSERT(px != 0); // <-- ça plante ici ^^
return *px;
} |
Ai-je bien utilisé mon shared_ptr ?
Sinon si ce n'est pas cela, je resitue le contexte :
J'ai deux classes AtelierPerfo et Ordo définies ainsi (je ne mets pas tout):
1 2 3 4 5 6 7 8 9 10 11 12
| class AtelierPerfo
{
public :
boost::shared_ptr<Ordo> ordo;
void LienActionPalier(boost::shared_ptr<Palier> palier);
};
class Ordo
{
public :
double NEH();
}; |
Rien de bien sorcier. Voici la méthode LienActionPalier :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| // Lien vers une action à exécuter sur un palier
void AtelierPerfo::LienActionPalier(PalierPtr palier)
{
// LienActionPalier est une action à exécuter lorsque l'on a
// trouvé une affectation des nbMach opérateurs sur les machines.
// Par exemple, on peut vouloir enregistrer les affectations, ou calculer
// par NEH l'ordonnancement "optimal" pour cette affectation...
// Ce qu'il se passe, c'est que dans les fonctions d'affectation
// (Typiquement AffectationRecursive) lorsqu'une affectation est trouvée,
// elle est écrasée. Voilà pourquoi on voudrait l'enregostrer.
// L'affectation actuelle est le tableau d'entiers affect, qui est de taille
// nbMach.
std::cout << "Appel de LienActionPalier ; Nombre de paliers = "
<< palier.use_count() << std::endl;
doublePtr ResultatNEH;
AtelierPtr NotreAtelier(this);
// On a trouvé une affectation valide de plus :
palier -> NbAffectationsPalier++;
// Avant d'appeler ordo->NEH, assurons-nous que ordo connaisse bien les
// durées des jobs.
CalculPijReel();
//ordo.reset( new Ordo((AtelierPtr)this));
(*ResultatNEH) = ordo->NEH(); // <-- Ici le programme saute à shared_ptr.hpp
// dont le code est donné ci-dessus, puis plante.
palier->EnregistrementCriteres.Ajouter(ResultatNEH);
} |
Les déclarations de type en MachinPtr ont une déclaration préalable ci-dessous, ce sont juste des pointeurs boost :
typedef boost::shared_ptr<Machin> [color=redMachinPtr[/color];
À l'exécution du programme (sans débogage), ça me donne le message d'erreur suivant :
Projet: /usr/include/boost/shared_ptr.hpp:247: typename boost::detail::shared_ptr_traits<T>::reference boost::shared_ptr<T>::operator*() const [with T = double]: Assertion `px != 0' failed.
Si vous avez une idée, je vous proposerai d'essayer me battre au casse-briques. 
Merci d'avance,
Le Barde.
Partager