Maison >développement back-end >C++ >Pourquoi ne puis-je pas insérer directement des pointeurs uniques dans des vecteurs ?

Pourquoi ne puis-je pas insérer directement des pointeurs uniques dans des vecteurs ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-25 02:15:13849parcourir

Why Can't I Directly Push Unique Pointers into Vectors?

Problèmes liés à l'insertion de pointeurs uniques dans des vecteurs

En essayant de manipuler des pointeurs uniques dans un vecteur, les programmeurs peuvent rencontrer des difficultés. Cet article vise à expliquer pourquoi ce problème se produit et à fournir une solution.

Considérez l'extrait de code suivant :

std::vector<std::unique_ptr<int>> vec;

int x(1);
std::unique_ptr<int> ptr2x(&x);
vec.push_back(ptr2x); // Error: Can't copy a unique_ptr

Ce code génère une erreur en raison des principes sous-jacents des pointeurs uniques. Un pointeur unique garantit qu’un seul conteneur contrôle le pointeur géré. Par conséquent, copier ou créer plusieurs pointeurs uniques vers le même objet est interdit.

Pour résoudre ce problème, nous devons utiliser le constructeur de déplacement, qui transfère la propriété du pointeur d'un pointeur unique à un autre. Voici le code corrigé :

vec.push_back(std::move(ptr2x));

Il est crucial de noter que l'utilisation de pointeurs uniques pour gérer les pointeurs vers des variables locales, telles que x dans l'exemple fourni, est incorrecte. Les variables locales sont automatiquement gérées et leur durée de vie se termine lorsque le bloc conteneur est terminé. Au lieu de cela, allouez les objets de manière dynamique :

std::unique_ptr<int> ptr(new int(1));

En C 14, nous pouvons encore simplifier cela en utilisant make_unique :

make_unique<int>(5);

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn