Maison >développement back-end >C++ >Pourquoi ne puis-je pas « push_back » des pointeurs uniques dans un vecteur et comment puis-je y remédier ?

Pourquoi ne puis-je pas « push_back » des pointeurs uniques dans un vecteur et comment puis-je y remédier ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-22 14:12:10128parcourir

Why Can't I `push_back` Unique Pointers into a Vector, and How Do I Fix It?

Vecteur de pointeurs uniques : pourquoi le push_back est rejeté et comment le surmonter

En C, nous rencontrons une pierre d'achoppement lorsque nous essayons de stocker des éléments uniques pointeurs dans les vecteurs. Les conteneurs vectoriels attendent des éléments qui permettent la copie, tandis que les pointeurs uniques adhèrent strictement au principe de propriété unique.

Considérez l'extrait suivant :

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

int x(1);
std::unique_ptr<int> ptr2x(&x);
vec.push_back(ptr2x); // Compiler error: attempt to copy unique pointer

L'erreur provient de la conception de unique_ptr pour garantir l'exclusivité possession. Copier un unique_ptr violerait cette propriété fondamentale, compromettant son objectif principal.

Déplacer pour résoudre le dilemme

Pour résoudre ce problème, nous devons utiliser l'opération "move" plutôt que de copier. L'opération de déplacement transfère la propriété d'un conteneur à un autre, garantissant ainsi l'absence de duplication.

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

Avec cette modification, le code insère avec succès le unique_ptr dans le vecteur, conservant sa propriété exclusive.

Une mise en garde

Il est crucial de noter que l'utilisation d'un unique_ptr pour gérer un pointeur vers une variable locale comme « x » n'est pas recommandé. Les variables locales sont automatiquement gérées lors de la sortie du bloc (par exemple, le retour de fonction dans ce cas). Au lieu de cela, vous devez allouer l'objet de manière dynamique.

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

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

std::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