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.
Réponse
Trop de publicités?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.
- Réponses précédentes
- Plus de réponses