Comprendre l'erreur
Considérez le programme suivant :
#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(ptr2x); // Error occurs here }
Ce code apparemment inoffensif tente de pousser un unique_ptr en un vecteur. Cependant, la compilation échoue avec une erreur :
error: deleted function 'std::unique_ptr<int>::unique_ptr(const std::unique_ptr<int>&)'
La nature de unique_ptr
Le unique_ptr est un élément fondamental de la bibliothèque standard C qui est utilisé pour gérer la durée de vie des objets alloués dynamiquement. Il garantit que le pointeur qu’il encapsule ne peut pas être copié. Cela signifie que la propriété de l'objet géré est exclusive au conteneur unique_ptr.
Le problème
L'erreur survient parce que le programme tente de pousser une copie de unique_ptr dans le vecteur. Cependant, comme mentionné précédemment, unique_ptrs ne peut pas être copié. Au lieu de cela, ils ne peuvent être déplacés.
Solution
Par conséquent, pour résoudre le problème, nous devons utiliser la fonction std::move pour transférer la propriété de unique_ptr de la variable d'origine au vecteur. Le code corrigé devrait ressembler à ceci :
#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(std::move(ptr2x)); // Use std::move to transfer ownership }
Maintenant, le compilateur sera capable de compiler et d'exécuter le programme avec succès sans aucune erreur.
Considérations supplémentaires
Il est important de noter que l'utilisation de unique_ptr dans le code est incorrecte. unique_ptr est destiné à gérer les objets alloués dynamiquement. Le pointeur dans le code pointe vers une variable locale qui sera détruite au retour de la fonction. Pour résoudre ce problème, le code doit allouer l'objet de manière dynamique :
#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; std::unique_ptr<int> ptr(new int(1)); // Dynamically allocate the object vec.push_back(std::move(ptr)); }
Vous pouvez également utiliser la fonction std::make_unique pour créer le unique_ptr et allouer l'objet sur une seule ligne :
#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; vec.push_back(std::make_unique<int>(1)); }
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!