web-dev-qa-db-fra.com

Utilisation recommandée de std :: unique_ptr

Quelles sont les utilisations recommandées d'un std::unique_ptr pour savoir précisément où, quand et comment est-il le mieux utilisé?

J'ai découvert:

À propos des performances unique_ptr

Je sais déjà:

  1. std::unique_ptr a été développé en C++ 11 en remplacement de std::auto_ptr
  2. C'est un std::unique_ptr n'a pas de comptage de références et "possède" l'objet vers lequel il pointe
  3. Il n'y a pas de copie/affectation avec un std::unique_ptr
  4. Lorsque j'ai besoin d'un pointeur unique, std::unique_ptr est la structure de référence

Ce que j'aimerais savoir:

  1. Utilise un std::unique_ptr toujours préférable (autre que l'unicité) à quelque chose
    autre? Qu'est-ce que je gagne dans cette situation?
  2. Si oui, dans quelles circonstances et quand?
  3. Étant donné la nécessité de déplacer la sémantique, cela ferait-il un std::unique_ptr moins favorable
    global?
  4. Si un std::shared_ptr suffirait pour une gestion dynamique de la mémoire dans presque toutes les situations, pourquoi avoir à ma disposition un std::unique_ptr matière (encore une fois, autre
    que l'unicité)?
33
Mushy

En théorie, vous devez utiliser unique_ptr pour tous les pointeurs, sauf si vous savez que vous souhaitez le partager, auquel cas vous devez utiliser shared_ptr. La raison en est que unique_ptr a moins de frais généraux car il ne compte pas les références.

Cependant, un unique_ptr est mobile mais pas copiable, donc en utiliser une comme variable membre peut vous obliger à écrire plus de code (par exemple un constructeur de déplacement), en passant un par valeur signifie que vous devrez utiliser std::move etc. En conséquence, certaines personnes utilisent shared_ptr par paresse, car c'est juste plus facile, et la différence de performance peut ne pas être importante pour leur application.

Enfin, un pointeur brut est parfait pour l'observation - des utilisations de pointeur qui ne peuvent jamais affecter la durée de vie. Un choix judicieux du bon type de pointeur peut donner à ceux qui lisent votre code une bonne compréhension de ce que vous faites. Pour en savoir plus, consultez l'essai de Herb Sutter, Elements of C++ Style , en particulier la section "no delete".

10
Kate Gregory