Avertissement C26415

Le paramètre de pointeur intelligent est utilisé uniquement pour accéder au pointeur autonome. Utilisez plutôt T* ou T>.

Instructions principales C++ : R.30 : Prendre des pointeurs intelligents en tant que paramètres uniquement pour exprimer explicitement la sémantique de durée de vie

L’utilisation d’un type de pointeur intelligent pour transmettre des données à une fonction indique que la fonction cible doit gérer la durée de vie de l’objet contenu. Toutefois, supposons que la fonction utilise uniquement le pointeur intelligent pour accéder à l’objet contenu et n’appelle jamais réellement de code susceptible d’entraîner sa désallocation (autrement dit, n’affecte jamais sa durée de vie). Il n’est généralement pas nécessaire de compliquer l’interface avec des pointeurs intelligents. Un pointeur simple ou une référence à l’objet contenu est préféré.

Notes

Cette case activée couvre la plupart des scénarios qui provoquent également C26410, C26415, C26417 et C26418. Il est préférable de propre SMART_PTR_NOT_NEEDED d’abord, puis de basculer vers des cas de périphérie pour les pointeurs partagés ou uniques. Pour une propre up plus ciblée, cet avertissement peut être désactivé.

Outre les modèles std ::unqiue_pointer et std ::shared_pointer standard, cette case activée reconnaît les types définis par l’utilisateur qui sont susceptibles d’être des pointeurs intelligents. Ces types sont censés définir les opérations suivantes :

  • Déréférencement surchargé ou opérateurs d’accès aux membres qui sont publics et non marqués comme supprimés.
  • Destructeur public qui n’est pas supprimé ou défini par défaut, y compris les destructeurs qui sont explicitement définis vides.

L’interprétation des opérations qui peuvent affecter la durée de vie des objets contenus est large et inclut :

  • Toute fonction qui accepte un pointeur ou un paramètre de référence vers un pointeur intelligent non constant
  • Copier ou déplacer des constructeurs ou des opérateurs d’affectation
  • Fonctions non constantes

Exemples

Gestion fastidieuse de la durée de vie.

bool set_initial_message(
            const std::unique_ptr<message> &m) // C26415, also C26410 NO_REF_TO_CONST_UNIQUE_PTR
{
    if (!m || initial_message_)
        return false;

    initial_message_.reset(m.get());
    return true;
}

void pass_message(const message_info &info)
{
    auto m = std::make_unique<message>(info);
    const auto release = set_initial_message(m);
    // ...
    if (release)
        m.release();
}

Gestion fastidieuse de la durée de vie - retravaillée.

void set_initial_message(std::shared_ptr<message> m) noexcept
{
    if (m && !initial_message_)
        initial_message_ = std::move(m);
}

void pass_message(const message_info &info)
{
    auto m = std::make_shared<message>(info);
    set_initial_message(m);
    // ...
}