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!