133 votes

Copie du constructeur d'une classe avec unique_ptr

Comment puis-je implémenter un constructeur de copie pour une classe qui a un unique_ptr variable membre ? Je ne considère que C++11.

0voto

IceFire Points 159

unique_ptr n'est pas copiable, il est seulement déplaçable.

Cela aura une incidence directe sur le test, qui est, dans votre deuxième exemple, également uniquement déplaçable et non copiable.

En fait, il est bon que vous utilisiez unique_ptr ce qui vous protège d'une grosse erreur.

Par exemple, le principal problème de votre premier code est que le pointeur n'est jamais supprimé, ce qui est vraiment, vraiment mauvais. Disons que vous pourriez résoudre ce problème en :

class Test
{
    int* ptr; // writing this in one line is meh, not sure if even standard C++

    Test() : ptr(new int(10)) {}
    ~Test() {delete ptr;}
};

int main()
{       
     Test o;
     Test t = o;
}

C'est également mauvais. Que se passe-t-il, si vous copiez Test ? Il y aura deux classes qui ont un pointeur qui pointe vers la même adresse.

Quand on Test est détruit, il détruira également le pointeur. Lorsque votre deuxième Test est détruit, il va essayer de supprimer la mémoire derrière le pointeur, aussi bien. Mais elle a déjà été supprimée et nous obtiendrons une erreur d'exécution d'accès à la mémoire (ou un comportement indéfini si nous sommes malchanceux).

La bonne solution consiste donc à implémenter le constructeur de copie et l'opérateur d'affectation de copie, afin que le comportement soit clair et que nous puissions créer une copie.

unique_ptr est en avance sur nous ici. Il a le sens sémantique : " Je suis unique donc tu ne peux pas juste me copier. " Ainsi, il nous évite l'erreur de mettre en œuvre maintenant les opérateurs à portée de main.

Vous pouvez définir un constructeur de copie et un opérateur d'affectation de copie pour un comportement spécial et votre code fonctionnera. Mais vous êtes, à juste titre ( !), obligé de le faire.

La morale de l'histoire : toujours utiliser unique_ptr dans ce genre de situation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X