Bonsoir,

J'ai un drôle de problème concernant les smart pointers. J'ai une ligne qui pose problème, cette ligne étant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
(*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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.