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
Libérer: 2024-12-25 02:15:13
original
847 Les gens l'ont consulté

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
Copier après la connexion

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));
Copier après la connexion

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));
Copier après la connexion

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

make_unique<int>(5);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal