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
DDDoriginal
2024-12-29 02:35:09988parcourir

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>&)'

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;
}

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!

Déclaration:
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