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 :
	
	| 12
 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):
	
	| 12
 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 :
	
	| 12
 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