Partage
  • Partager sur Facebook
  • Partager sur Twitter

Nuller un objet ayant des pointeurs comme membres

    2 février 2019 à 12:03:29

    Bonjour,

    J'avais une simple question par rapport aux pointeurs intelligents et nullptr

    class Foo
    {
    public:
    	Foo()
    	{
    		ptr = std::make_unique<int>(0);
    	}
    
    private:
    	std::unique_ptr<int> ptr;
    };
    
    int main()
    {
    	std::unique_ptr<Foo> foo = std::make_unique<Foo>();
    
    	foo = nullptr;
    }

    Qu'adviendra-t-il de ptr contenu dans foo ?

    J'imagine que ptr ne sera pas désalloué et qu'on aura une fuite de mémoire, mais j'aimerais être sûr de moi.

    -
    Edité par Raynobrak 2 février 2019 à 12:08:03

    • Partager sur Facebook
    • Partager sur Twitter
      2 février 2019 à 12:12:16

      Lu'!

      Si, c'est le principe de unique_ptr. S'il ne faisait pas ça, il n'aurait pas grand chose d'intelligent. Ici, unique_ptr va appeller le destructeur de Foo sur l'objet alloué en interne puis mettre nullptr à la place. Comme l'objet interne "ptr" est aussi un unique_ptr, son destructeur est appelé à son tour, libérant l'entier.

      • Partager sur Facebook
      • Partager sur Twitter

      Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

        2 février 2019 à 12:26:44

        Ksass`Peuk a écrit:

        Lu'!

        Si, c'est le principe de unique_ptr. S'il ne faisait pas ça, il n'aurait pas grand chose d'intelligent. Ici, unique_ptr va appeller le destructeur de Foo sur l'objet alloué en interne puis mettre nullptr à la place. Comme l'objet interne "ptr" est aussi un unique_ptr, son destructeur est appelé à son tour, libérant l'entier.


        Et moi qui croyait avoir trouvé une faille dans les unique_ptr. C'est vrai que si il n'était pas capable de gérer un cas si banal, ils ne mériterait pas l’adjectif intélligent.

        En tout cas, merci !

        • Partager sur Facebook
        • Partager sur Twitter
          4 février 2019 à 18:11:32

          Ça n'a rien à voir avec unique_ptr. C'est tout simplement RAII et le destructeur de l'objet. Toutes les variables membres sont détruites par le destructeur de l'objet dans le sens inverse de leur déclaration (et donc de manière récursive).

          {
              Foo f;
          }
          // f est détruit et appelle le destructeur de f.ptr

          Et

          auto f = make_unique<Foo>();
          f = nullptr;
          // identique

          D'ailleurs, unique_ptr peut être configuré pour prendre un deleter en paramètre. Ce qui est particulièrement pratique pour wrapper des lib C.

          std::unique_ptr<SDL_Window, void (*)(SDL_Window*)> win(
              SDL_CreateWindow(...),
              SDL_DestroyWindow
          );





          -
          Edité par markand 4 février 2019 à 18:13:08

          • Partager sur Facebook
          • Partager sur Twitter

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

          Nuller un objet ayant des pointeurs comme membres

          × 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