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!