IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

Utilisation de l'opérateur * avec shared_ptr<>


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Par défaut Utilisation de l'opérateur * avec shared_ptr<>
    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.

  2. #2
    screetch
    Invité(e)
    Par défaut
    et biens tu as un pointeur non initialisé, stout!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    doublePtr ResultatNEH = new double;

  3. #3
    Membre éclairé
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Par défaut
    Ah oui, alors là...
    Mais j'ai toujours le problème de SIGABRT :

    dans LienActionPalier, la dernière instruction consiste à ajouter un élément (un pointeur vers un double en l'occurrence) à la liste EnregistrementCriteres. Ça se psase ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	palier->EnregistrementCriteres.Ajouter(ResultatNEH);
    Là on va chercher dans Liste<Palier> la méthode Ajouter :

    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
    template<typename TYPE> void Liste<TYPE>::Ajouter(boost::shared_ptr<TYPE> Element, Emplacement Lieu)
    {
    	boost::shared_array<boost::shared_ptr<TYPE> > AncienneListe;
    	AncienneListe.swap( TableauDeReference);
    	if (Lieu == DEBUT)
    	{
    		TableauDeReference.reset( new boost::shared_ptr<TYPE>[Taille+1]);
    		TableauDeReference[0] = Element;
    		for (int i=1 ; i<=Taille ; i++)
    		{
    			TableauDeReference[i] = AncienneListe[i];	
    		}
    		Taille++;
    	}
    	else if (Lieu == FIN)
    	{
    		TableauDeReference.reset( new boost::shared_ptr<TYPE>[Taille+1]);
    		TableauDeReference[Taille] = Element;
    		for (int i=0 ; i<Taille ; i++)
    		{
    			TableauDeReference[i] = AncienneListe[i];	
    		}
    		Taille++;
    	}
    }
    Le programme tourne jusqu'à la fin de cette méthode, puis SIGABRT
    Selon moi, il détruit des pointeurs dont on n'a plus besoin (notamment dans les classes boost il y a visiblement des appels à des méthodes release()...), mais je ne vois pas ce que ça donne de plus

  4. #4
    Membre éclairé
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Par défaut
    Plus précisément, plein de trucs sont détruits à ce moment-là, et j'ai réussi à trouver l'instruction qui foire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    checked_delete.hpp :
    template<class T> inline void checked_delete(T * x)
    {
        // intentionally complex - simplification causes regressions
        typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
        (void) sizeof(type_must_be_complete);
        delete x;
    }
    Et pas moyen à ce moment-là de préciser le delete, c'est cette instruction-là qui fait lancer le signal abort.
    En regardant dans le débogueur, l'objet courant, x, est de type AtelierPerfo*, et c'est ça qui est "deleted" dans l'instruction ci-dessus. Ce qui est complètement étrange, parce qu'on s'en sert encore, de cet AtelierPerfo, et c'est même une méthode de cette classe qui essaye de s'autodétruire !

    Si vous avez des idées...

  5. #5
    Membre éclairé
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Par défaut
    Ca me donne ce truc archi moche :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    *** glibc detected *** ./Executable/Projet: double free or corruption (!prev): 0x08072a58 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb743c7cd]
    /lib/tls/i686/cmov/libc.so.6(cfree+0x90)[0xb743fe30]
    /usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb75fed11]
    ./Executable/Projet[0x804f1b6]
    ./Executable/Projet[0x804f2ee]
    ./Executable/Projet[0x804cbe0]
    ./Executable/Projet[0x804cc18]
    ./Executable/Projet[0x804ccca]
    ./Executable/Projet[0x805dac2]
    ./Executable/Projet[0x805de21]
    ./Executable/Projet[0x805dd95]
    ./Executable/Projet[0x805dd95]
    ./Executable/Projet[0x805dd95]
    ./Executable/Projet[0x805dd95]
    ./Executable/Projet[0x805de9f]
    ./Executable/Projet[0x805e289]
    ./Executable/Projet[0x8061060]
    ./Executable/Projet[0x805fab1]
    ./Executable/Projet[0x805febd]
    ./Executable/Projet[0x805d383]
    ./Executable/Projet[0x804c106]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xdc)[0xb73eaebc]
    ./Executable/Projet(__gxx_personality_v0+0x1b1)[0x804af51]
    ======= Memory map: ========
    08048000-0806a000 r-xp 00000000 08:01 4046865    /home/adrien/Documents/Travail/recherche/StageFlowShop/C++/Executable/Projet
    0806a000-0806b000 rw-p 00021000 08:01 4046865    /home/adrien/Documents/Travail/recherche/StageFlowShop/C++/Executable/Projet
    0806b000-0808c000 rw-p 0806b000 00:00 0          [heap]
    b7000000-b7021000 rw-p b7000000 00:00 0
    b7021000-b7100000 ---p b7021000 00:00 0
    b71f6000-b71f8000 rw-p b71f6000 00:00 0
    b71f8000-b71fc000 r-xp 00000000 08:03 1317926    /usr/lib/libXfixes.so.3.1.0
    b71fc000-b71fd000 rw-p 00003000 08:03 1317926    /usr/lib/libXfixes.so.3.1.0
    b71fd000-b71fe000 rw-p b71fd000 00:00 0
    b71fe000-b721c000 r-xp 00000000 08:03 1316922    /usr/lib/libexpat.so.1.0.0
    b721c000-b721e000 rw-p 0001d000 08:03 1316922    /usr/lib/libexpat.so.1.0.0
    b721e000-b7222000 r-xp 00000000 08:03 1317476    /usr/lib/libXdmcp.so.6.0.0
    b7222000-b7223000 rw-p 00003000 08:03 1317476    /usr/lib/libXdmcp.so.6.0.0
    b7223000-b7225000 r-xp 00000000 08:03 1318317    /usr/lib/libXau.so.6.0.0
    b7225000-b7226000 rw-p 00001000 08:03 1318317    /usr/lib/libXau.so.6.0.0
    b7226000-b723b000 r-xp 00000000 08:03 1318292    /usr/lib/libICE.so.6.3.0
    b723b000-b723d000 rw-p 00014000 08:03 1318292    /usr/lib/libICE.so.6.3.0
    b723d000-b723e000 rw-p b723d000 00:00 0
    b723e000-b7246000 r-xp 00000000 08:03 1317949    /usr/lib/libSM.so.6.0.0
    b7246000-b7247000 rw-p 00007000 08:03 1317949    /usr/lib/libSM.so.6.0.0
    b7247000-b7248000 rw-p b7247000 00:00 0
    b7248000-b72b0000 r-xp 00000000 08:03 1317724    /usr/lib/libfreetype.so.6.3.10
    b72b0000-b72b3000 rw-p 00068000 08:03 1317724    /usr/lib/libfreetype.so.6.3.10
    b72b3000-b72c4000 r-xp 00000000 08:03 1316754    /usr/lib/libXft.so.2.1.2
    b72c4000-b72c5000 rw-p 00010000 08:03 1316754    /usr/lib/libXft.so.2.1.2
    b72c5000-b72c7000 r-xp 00000000 08:03 1318056    /usr/lib/libXinerama.so.1.0.0
    b72c7000-b72c8000 rw-p 00001000 08:03 1318056    /usr/lib/libXinerama.so.1.0.0
    b72c8000-b72d0000 r-xp 00000000 08:03 1317948    /usr/lib/libXcursor.so.1.0.2
    b72d0000-b72d1000 rw-p 00007000 08:03 1317948    /usr/lib/libXcursor.so.1.0.2
    b72d1000-b72d6000 r-xp 00000000 08:03 1317996    /usr/lib/libXrandr.so.2.1.0
    b72d6000-b72d7000 rw-p 00005000 08:03 1317996    /usr/lib/libXrandr.so.2.1.0
    b72d7000-b72de000 r-xp 00000000 08:03 1317517    /usr/lib/libXrender.so.1.3.0
    b72de000-b72df000 rw-p 00006000 08:03 1317517    /usr/lib/libXrender.so.1.3.0
    b72df000-b72e0000 rw-p b72df000 00:00 0
    b72e0000-b72e7000 r-xp 00000000 08:03 1317980    /usr/lib/libXi.so.6.0.0
    b72e7000-b72e8000 rw-p 00006000 08:03 1317980    /usr/lib/libXi.so.6.0.0
    b72e8000-b72fb000 r-xp 00000000 08:03 1316906    /usr/lib/libz.so.1.2.3
    b72fb000-b72fc000 rw-p 00012000 08:03 1316906    /usr/lib/libz.so.1.2.3
    b72fc000-b731e000 r-xp 00000000 08:03 1317514    /usr/lib/libpng12.so.0.15.0
    b731e000-b731f000 rw-p 00021000 08:03 1317514    /usr/lib/libpng12.so.0.15.0
    b731f000-b733d000 r-xp 00000000 08:03 1318838    /usr/lib/libjpeg.so.62.0.0
    b733d000-b733e000 rw-p 0001d000 08:03 1318838    /usr/lib/libjpeg.so.62.0.0
    b733e000-b738b000 r-xp 00000000 08:03 1318200    /usr/lib/libXt.so.6.0.0
    b738b000-b738f000 rw-p 0004c000 08:03 1318200    /usr/lib/libXt.so.6.0.0
    b738f000-b73a4000 r-xp 00000000 08:03 1320067    /usr/lib/libaudio.so.2.4
    b73a4000-b73a5000 rw-p 00015000 08:03 1320067    /usr/lib/libaudio.so.2.4
    b73a5000-b73a6000 rw-p b73a5000 00:00 0
    b73a6000-b73c9000 r-xp 00000000 08:03 1317959    /usr/lib/libfontconfig.so.1.2.0
    b73c9000-b73d1000 rw-p 00023000 08:03 1317959    /usr/lib/libfontconfig.so.1.2.0
    b73d1000-b73d3000 r-xp 00000000 08:03 601492     /lib/tls/i686/cmov/libdl-2.5.so
    b73d3000-b73d5000 rw-p 00001000 08:03 601492     /lib/tls/i686/cmov/libdl-2.5.so
    b73d5000-b7510000 r-xp 00000000 08:03 601487     /lib/tls/i686/cmov/libc-2.5.so
    b7510000-b7511000 r--p 0013b000 08:03 601487     /lib/tls/i686/cmov/libc-2.5.so
    b7511000-b7513000 rw-p 0013c000 08:03 601487     /lib/tls/i686/cmov/libc-2.5.so
    b7513000-b7516000 rw-p b7513000 00:00 0
    b7516000-b7521000 r-xp 00000000 08:03 569042     /lib/libgcc_s.so.1
    b7521000-b7522000 rw-p 0000a000 08:03 569042     /lib/libgcc_s.so.1
    b7522000-b7547000 r-xp 00000000 08:03 601495     /lib/tls/i686/cmov/libm-2.5.so
    b7547000-b7549000 rw-p 00024000 08:03 601495     /lib/tls/i686/cmov/libm-2.5.so
    b7549000-b754a000 rw-p b7549000 00:00 0
    b754a000-b7629000 r-xp 00000000 08:03 1316849    /usr/lib/libstdc++.so.6.0.8
    b7629000-b762c000 r--p 000de000 08:03 1316849    /usr/lib/libstdc++.so.6.0.8
    b762c000-b762e000 rw-p 000e1000 08:03 1316849    /usr/lib/libstdc++.so.6.0.8
    b762e000-b7634000 rw-p b762e000 00:00 0
    b7634000-b7647000 r-xp 00000000 08:03 601588     /lib/tls/i686/cmov/libpthread-2.5.so
    b7647000-b7649000 rw-p 00013000 08:03 601588     /lib/tls/i686/cmov/libpthread-2.5.so
    b7649000-b764b000 rw-p b7649000 00:00 0
    b764b000-b7738000 r-xp 00000000 08:03 1317479    /usr/lib/libX11.so.6.2.0
    b7738000-b773c000 rw-p 000ed000 08:03 1317479    /usr/lib/libX11.so.6.2.0
    b773c000-b7749000 r-xp 00000000 08:03 1317487    /usr/lib/libXext.so.6.4.0
    b7749000-b774a000 rw-p 0000d000 08:03 1317487    /usr/lib/libXext.so.6.4.0
    b774a000-b7f10000 r-xp 00000000 08:03 1318893    /usr/lib/libqt-mt.so.3.3.7
    b7f10000-b7f56000 rw-p 007c5000 08:03 1318893    /usr/lib/libqt-mt.so.3.3.7
    b7f56000-b7f5a000 rw-p b7f56000 00:00 0
    b7f5a000-b7f6e000 r-xp 00000000 08:03 1318982    /usr/lib/liblua50.so.5.0
    b7f6e000-b7f6f000 rw-p 00014000 08:03 1318982    /usr/lib/liblua50.so.5.0
    b7f6f000-b7f70000 rw-p b7f6f000 00:00 0
    b7f70000-b7f7f000 r-xp 00000000 08:03 1318993    /usr/lib/liblualib50.so.5.0
    b7f7f000-b7f80000 rw-p 0000f000 08:03 1318993    /usr/lib/liblualib50.so.5.0
    b7f80000-b7fad000 r-xp 00000000 08:03 1324856    /usr/lib/libluabind.so.0.0.0
    b7fad000-b7fae000 rw-p 0002d000 08:03 1324856    /usr/lib/libluabind.so.0.0.0
    b7fca000-b7fcd000 rw-p b7fca000 00:00 0
    b7fcd000-b7fe6000 r-xp 00000000 08:03 575349     /lib/ld-2.5.so
    b7fe6000-b7fe8000 rw-p 00019000 08:03 575349     /lib/ld-2.5.so
    bf902000-bf917000 rw-p bf902000 00:00 0          [stack]
    ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]
    Abandon (core dumped)
    adrien@adrien-portable:~/Documents/Travail/recherche/StageFlowShop/C++$

  6. #6
    screetch
    Invité(e)
    Par défaut
    tu fais ta boucle for de 0 a TAILLE inclus, ca fait TAILLE+1 fois, c'est voulu ?

Discussions similaires

  1. [11gR2] Utilisation de l'opérateur MINUS avec valeur à NULL
    Par lcaya dans le forum PL/SQL
    Réponses: 4
    Dernier message: 25/11/2014, 11h38
  2. [V6] Utilisation de l'opérateur Où avec agrégats ?
    Par jvaillant dans le forum Deski
    Réponses: 1
    Dernier message: 13/04/2010, 15h14
  3. [VxiR2] Utilisation de l'opérateur où avec une valeur = -1
    Par bastoonet dans le forum Deski
    Réponses: 4
    Dernier message: 29/04/2009, 22h36
  4. Utilisation simple d'@@IDENTITY avec asp
    Par Ajrarn dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/10/2003, 10h37
  5. Comment utiliser les styles XP avec Dev-C++?
    Par abraxas dans le forum Dev-C++
    Réponses: 3
    Dernier message: 05/10/2003, 19h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo