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++

  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 ?

  7. #7
    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
    Oui oui, j'ajoute un élément à ma liste, donc elle contient Taille+1 éléments, que je crée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TableauDeReference.reset( new boost::shared_ptr<TYPE>[Taille+1]);

  8. #8
    screetch
    Invité(e)
    Par défaut
    certes pour la nouvelle liste, mais quand tu inseres au debut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TableauDeReference[i] = AncienneListe[i];
    i vairant de 1 a TAILLE, AncienneListe ne va pas etre contente!

  9. #9
    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
    Ouh là, oui

    Bon mais ça n'a pas eu d'incidence, il se trouve que j'ajoute toujours à la FIN, en pratique... Je continue à chercher
    Merci déjà pour ces tuyaux !

  10. #10
    screetch
    Invité(e)
    Par défaut
    tu ne crees pas un shared_ptr sur un objet que tu as mis sur la pile par hasard ?

  11. #11
    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
    La pile ?

  12. #12
    screetch
    Invité(e)
    Par défaut
    un objet local
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {
      double d = 0;
      shared_ptr<double> value (&d); //crash!
    }
    tu ne peux mettre dans les shared ptr que des objets alloués avec new.

  13. #13
    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 d'accord, merci ! Je n'étais pas sûr de le savoir
    Je regarderai ça demain (aujourd'hui pas de recherche / programmation... du secrétariat ). Merci.

  14. #14
    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
    Et si on fait un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    boost::shared_ptr<Atelier> MonPetitAtelier(this);
    ?

    Ça le détruit à la fin du bloc courant ?

  15. #15
    screetch
    Invité(e)
    Par défaut
    oui

    en general on essaye de creer un shared_ptr<T>( new T )

    ca evite de "voler" un objet qui n'est pas a toi; quand tu le crées, tu l'encapsules direct.

    Ensuite, pour le partager, on copie le pointeur.

    Ceci est egalement interdit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    shared_ptr<T> p = shared_ptr<T>( new T );
    shared_ptr<T> p2 = p; //ok : on partage l'objet pointé
    shared_ptr<T> p3 = shared_ptr<T>(p.get()); // crash : on va avoir deux "shared_ptr" differents sur le meme pointeur et les deux vont le detruire
    // note que ca ne respecte pas le pattern shared_ptr<T>(new T); ni la copie!!!

  16. #16
    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
    Hello,
    J'imagine que c'était écrit quelque-part, mais j'avoue que je n'avais pas saisi que ça se détruirait si on créait un shared_ptr à partir de this, par exemple.

    En tous cas, ça fonctionne mieux
    Décidément, mon programme est truffé de bogues, mais je trouverai la suite par moi-même, je n'ai que trop abusé déjà. Merci beaucoup de ta gentillesse, screetch, j'a encor' appris des choses !

    (note, tout débutant que je suis, que ta remarque sur la pile m'a donné l'idée d'aller voir ce qui se tramait sous gdb, et maintenant j'suis un pro ud débogage. Enfin... on verra dans quelques années !)

  17. #17
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Si vraiment tu penses avoir besoin d'un shared_ptr sur this tu peux jeter un oeil à enable_shared_from_this.
    Mais bon si tu peux l'éviter c'est vraisemblablement plus sage...

    MAT.

  18. #18
    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
    Pas mal ce truc, mais en fait, je n'avais pas besoin de ce pointeur sur this. Mais c'est bon à savoir, ça.

  19. #19
    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
    Je progresse, je progresse dans mon programme... ça se débogue au fur et à mesure (ben oui, faire passer tout un projet en shared_ptr et autres, c'est pas forcément tout de suite immédiat).

    J'ai également une petite question, toujours en rapport (je crois) avec shared_ptr< >.

    J'ai une classe template définie ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template <typename INDICE,  typename TYPE> class ListeTriee : public Liste<TYPE>
    {
    	protected:
    	boost::shared_ptr<Liste<INDICE> > Indices;
    	int Taille;
    	public:
    	void Ajouter(INDICE Indice, boost::shared_ptr<TYPE> Element);
    	ListeTriee();
    	~ListeTriee();
    };
    Dans la méthode Ajouter, voici ce que j'y fais :

    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
    template <typename INDICE, typename TYPE> 
    void ListeTriee<INDICE,TYPE>::Ajouter(INDICE Indice, boost::shared_ptr<TYPE> Element)
    {
    	int cpt;
    	boost::shared_ptr<INDICE> IndicePtr(&Indice); //(Pour pouvoir faire appel à Liste::Ajouter()
    	                                              // il faut mettre comme premier argument un
    	                                              // shared_ptr)
    	
    	// On cherche ici à insérer dans la liste l'élément tel que Indice, placé au même indice que Element,
    	// forme une suite croissante du tableau Indices.
    	
    	// Pour cela, nous allons créer un nouveu tableau d'éléments.
    	boost::shared_array<boost::shared_ptr<TYPE> > NouveauTableau(new boost::shared_ptr<TYPE>[Taille+1]);
    	// On interchange TableauDeReference avec le tableau que ous venons de créer.
    	this->TableauDeReference.swap(NouveauTableau);
    	// On échange tout entre l'ancien tableau et le nouveau :
    	for (cpt=0 ; cpt < Taille ; cpt++)
    	{
    	  this->TableauDeReference[cpt].swap(NouveauTableau[cpt]);
    	}
    	// Maintenant, notre nouveau TableauDeReference contient un emplacement NULL à
    	// l'indice "Taille". Insérons-y notre élément.
    	this->TableauDeReference[Taille].reset(Element.get());
    	
    	// Il faut faire la même chose avec notre liste d'indices.
    	// Premièrement, ajouter à la fin de la liste l'indice pris en argument de notre fonction.
    	Indices->Ajouter(IndicePtr, FIN);
    	// Nous savons que la liste d'indices est triée, sauf évidemment pour le dernier indice, 
    	// que nous venons d'ajouter sans faire attention à sa valeur.
    	// Nous allons donc rechercher l'indice qui convient bien.
    	
    	cpt = Taille-1;
    	while (cpt >= 0 && cpt < Taille)
    	{ // si l'indice n° cpt a une valeur supérieure à l'indice n° cpt+1
    	  if (*(Indices->GetIndice(cpt)) > *(Indices->GetIndice(cpt+1)) )
    	  { // Alors on échange les valeurs des indices et les valeurs des éléments correspondants.
    	     Indices->GetIndice(cpt).swap( Indices->TableauDeReference[cpt+1] );
    	     this->TableauDeReference[cpt].swap( this->TableauDeReference[cpt+1] );
    	  }
    	  else
    	  { // Si ce n'est pas le cas, c'est que le tri est fini ; on sort de la boucle.
    	     break;
    	  }
    	  // Puis c'est reparti pour un tour.
    	  cpt--;
    	}
    	
    	
    	// La taille de notre liste est donc bien égale à Taille+1 maintenant.
    	Taille++;
    }
    J'ai deux questions :

    1. Le compilateur n'accepte pas que je considère par exemple TableauDeReference, qui appartient à la classe-mère. Par contre, je peux le joindre en faisant "this -> TableauDeReference". Vous auriez une idée de la raison ?

    2. à la ligne << this->TableauDeReference.swap(NouveauTableau); >> le programme envoie un SIGABRT... Je ne comprends pas trop pourquoi, en fait.

    Merci, si vous avez des idées...

  20. #20
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    En fait je me demande si tu vois bien ce qu'est un pointeur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::shared_ptr<INDICE> IndicePtr(&Indice);
    Ici tu prends l'adresse d'un paramètre (donc sur la pile), que tu mets dans un boost::shared_ptr qui en devient propriétaire, et en plus (si ça ne suffisait pas) tu l'insères dans un conteneur en données membre plus bas (enfin j'imagine que c'est ce que fait Ajouter, même si la signature donnée ne correspond pas).
    En résumé ça ne peut que faire n'importe quoi...

    Ca là aussi c'est super bizarre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->TableauDeReference[Taille].reset(Element.get());
    En gros tu tapes dans le pointeur nu avec get() pour le passer à un autre boost::shared_ptr qui en devient du coup propriétaire, ça fait au moins un propriétaire de trop.
    Je pense que c'est plus ça que tu veux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->TableauDeReference[Taille] = Element;
    Au passage tu devrais déclarer les variables locales au moment de les utiliser, donc pas :
    Mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int cpt=0 ; cpt < Taille ; ++cpt)
    (utilise des pré-incrémentations par défaut)

    En général on déclare virtual aussi les destructeurs des classes dérivées (je suppose que celui de la classe de base l'est, sinon c'est mal) même si ce n'est théoriquement pas nécessaire.

    L'impression générale c'est quand même que ça a l'air bien compliqué tes manipulations là, tu es sûr que c'est bien raisonnable ?
    Genre avoir des données en protected c'est déjà moyen mais les swap dans une classe dérivée j'avais encore jamais vu ça...

    Sinon pour 1) c'est une histoire de look-up, cf. par exemple C++ FAQ Lite sur le sujet (pour les méthodes mais c'est pareil je pense pour les données).

    Pour 2) c'est difficile juste là comme ça avec que des bouts de code.

    MAT.

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