Maison > développement back-end > C++ > Pourquoi ne puis-je pas pousser directement un pointeur unique dans un vecteur en C ?

Pourquoi ne puis-je pas pousser directement un pointeur unique dans un vecteur en C ?

DDD
Libérer: 2024-12-29 02:35:09
original
993 Les gens l'ont consulté

Why Can't I Directly Push a Unique Pointer into a Vector in C  ?

Comprendre le problème : insertion de pointeurs uniques dans des vecteurs

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>&)'
Copier après la connexion

Cette erreur survient car il n'est pas permis de copier des pointeurs uniques.

La nature 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.

Résoudre le problème : utiliser la sémantique de déplacement

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;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal