Partage
  • Partager sur Facebook
  • Partager sur Twitter

std::pair + std::unique_ptr

segfault dans le make_pair

Sujet résolu
    5 octobre 2018 à 18:48:31

    Bonjour a tous , 
    Je suis face a un cas etrange que j'arrive pas a m'expliquer.

    En gros , pourquoi ces lignes passent bien :

    OEntity owner = comp.data_.get()->Owner();
    std::pair <OEntity, std::unique_ptr<OBaseComponent>> tmp = std::make_pair<OEntity, std::unique_ptr<OBaseComponent>>(std::move(owner), std::move(comp.data_)); 

     Mais pas :

    std::unique_ptr<OBaseComponent>> tmp = std::make_pair<OEntity, std::unique_ptr<OBaseComponent>>(std::move(comp.data_.get()->Owner()), std::move(comp.data_));


    Entre les deux versions , la deuxieme produit un segfault sur : comp.data_.get()->Owner() au moment de l'appel a Owner();


    Merci d'avance pour vos reponses.

    • Partager sur Facebook
    • Partager sur Twitter
      5 octobre 2018 à 20:15:56

      Je pense que c'est parce que l'expression std::move(comp.data_) est exécutée avant celle de gauche, donc si comp.data_ est un unique_ptr il est vide après. En C++17 l'ordre des expression de gauche à droite est garanti. Dans le doute, faire des variables locales avant.

      Exemple de cas totalement dangereux : f(g(++i), h(++i))

      • Partager sur Facebook
      • Partager sur Twitter

      git is great because Linus did it, mercurial is better because he didn't.

        5 octobre 2018 à 20:23:47

        markand a écrit:

        Je pense que c'est parce que l'expression std::move(comp.data_) est exécutée avant celle de gauche, donc si comp.data_ est un unique_ptr il est vide après. En C++17 l'ordre des expression de gauche à droite est garanti. Dans le doute, faire des variables locales avant.

        Exemple de cas totalement dangereux : f(g(++i), h(++i))


        J'me doutais bien que c'etait quelque chose du genre :(
        Merci de la confirmation.
        • Partager sur Facebook
        • Partager sur Twitter

        std::pair + std::unique_ptr

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown