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

 C++ Discussion :

Allocation dynamique foireuse.


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Points : 99
    Points
    99
    Par défaut Allocation dynamique foireuse.
    Bonsoir,

    Cela ne dev(r)ait pas arriver, mais bon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            template<typename Protocol>
            void server_engine<Protocol>::visit(session<Protocol>* session, socket_impl<Protocol>& socket, handlers::change_handler_server<Protocol>* ch)
            {
                std::cout << "session= " << session<<std::endl; // Adresse valide
                //session = new sessions::server<Protocol>(socket, ch->some_id); // Appel du constructeur: OK
                //delete session; // Appel du destructeur: OK
                auto s2 = new sessions::server<Protocol>(socket, ch->some_id); //Appel du constructeur: OK, mais dans le constructeur, si je fais std::cout<<this<<std::endl; j'ai une adresse qui ressemble à celle ci-après.
     
                std::cout << "s2= " << s2 << std::endl; // Mauvaise adresse, du style... 0x46684fe648464abd64684....
                session = s2; // Evidemment, pas mieux ...
                std::cout << "session= " << session << std::endl; // Pas mieux ...
                std::cout << "s2= " << s2 << std::endl; // Pas mieux ...
            }
    Le but, étant d'écraser le pointeur session, et de le remplacer avec un pointeur tout frais
    Le problème n'est donc pas sur le remplacement du vieux pointeur toujours bon, mais sur la création du nouveau, et je ne vois pas pourquoi cela peut foirer.
    Avez-vous un idée ?

    Ensuite, juste au cas où, le pointeur recu par la fonction, est un pointeur contenu dans une std::map<k, session*>. Y a t il un risque ?!
    Où faut-il que je passe par quelque chose du style iterator->second = new_ptr; ?!

    Merci,

    nico

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    J'ai pas compris le problème mais le fait que tu modifies un pointeur passé par valeur est faux. Tu dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void server_engine<Protocol>::visit(session<Protocol>* &session, socket_impl<Protocol>& socket, handlers::change_handler_server<Protocol>* ch)
    (Note la référence &session).

    Mais encore faut-il que tu ne copies pas ce pointeur avant si tu veux le modifier directement dans ta collection il faut bien que tu passes directement le iter->second. En plus, tu devrais penser à utiliser des shared_ptr ou unique_ptr, ça te simplifierais la vie.

  3. #3
    Membre régulier
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Points : 99
    Points
    99
    Par défaut
    Apparement ca fonctionne

    Merci


    PS: Je m'en doutais que les shared_ptr allaient venir dans la conversation, mais merci, je m'en passe

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Tu t'en passes, mais ton code n'est pas robuste. Par exemple, en cas d'exception dans n'importe quel cout (sauf le premier), tu as une fuite mémoire.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme d'allocation dynamique
    Par vince3320 dans le forum C
    Réponses: 10
    Dernier message: 22/04/2004, 16h27
  2. petit pbm allocation dynamique de stringGrid
    Par AnneOlga dans le forum C++Builder
    Réponses: 10
    Dernier message: 17/01/2004, 11h59
  3. Allocation dynamique de structures
    Par fr_knoxville dans le forum C
    Réponses: 8
    Dernier message: 06/05/2003, 21h59
  4. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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