Maison >développement back-end >C++ >Pourquoi ne puis-je pas pousser directement un pointeur unique dans un vecteur en C ?
Le code fourni tente de pousser un pointeur unique dans un vecteur. Cependant, le message d'erreur indique la raison de l'échec de la compilation :
error: deleted function 'std::unique_ptr<int>::unique_ptr(const std::unique_ptr<int>&)'
Cette erreur survient car il n'est pas permis de copier des pointeurs uniques.
Un pointeur unique, comme son nom l'indique, établit la propriété exclusive d'un emplacement mémoire dynamique. Il garantit qu’il n’y aura qu’un seul conteneur de pointeur unique propriétaire du pointeur détenu. Par conséquent, créer une copie d’un pointeur unique devient interdit. La copie entraînerait deux pointeurs uniques revendiquant la propriété de la même mémoire dynamique, ce qui violerait la règle inhérente de propriété unique.
Au lieu de cela, lorsqu'il faut transférer la propriété d'un pointeur unique vers un autre conteneur ou une autre fonction, le déplacement la sémantique de C entre en jeu.
La solution à l'erreur de compilation et au problème de la poussée de pointeurs uniques en vecteurs réside dans l’exploitation de la sémantique des mouvements. La sémantique de déplacement, implémentée à l'aide de la fonction std::move, transfère la propriété du pointeur unique sans créer de copie.
Dans ce scénario, l'extrait de code corrigé serait :
int main() { std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(new int(x)); // Allocate the object dynamically vec.push_back(std::move(ptr2x)); // Transfer ownership with move semantics return 0; }
En utilisant std::move, la propriété de ptr2x est transférée à vec, et ptr2x se retrouve avec un nullptr.
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!