Partager via


Avertissement C26409

Évitez d’appeler new et delete explicitement, utilisez std::make_unique<T> plutôt (r.11).

Même si le code est propre aux appels et free, nous vous suggérons toujours de considérer de meilleures options que l’utilisation explicite d’opérateurs new et delete.malloc

Recommandations principales en C++ :
R.11 : Éviter d’appeler explicitement de nouveaux appels et de supprimer

Le correctif ultime consiste à utiliser des pointeurs intelligents et des fonctions d’usine appropriées, telles que std::make_unique.

Notes

  • Le vérificateur avertit les appels à n’importe quel type d’opérateur new ou delete: scalaire, vecteur, versions surchargées (globales et spécifiques à la classe) et versions de placement. Le cas de placement new peut nécessiter des clarifications dans les Recommandations de base pour les correctifs suggérés et peut être omis à l’avenir.

Nom de l’analyse du code : NO_NEW_DELETE

Exemples

Cet exemple montre que C26409 est déclenché pour explicite new et delete. Envisagez plutôt d’utiliser des fonctions de fabrique de pointeur intelligentes, comme std::make_unique à la place.

void f(int i)
{
    int* arr = new int[i]{}; // C26409, warning is issued for all new calls
    delete[] arr;            // C26409, warning is issued for all delete calls

    auto unique = std::make_unique<int[]>(i); // prefer using smart pointers over new and delete
}

Il existe un idiome C++ qui déclenche cet avertissement : delete this. L’avertissement est intentionnel, car les recommandations de base C++ découragent ce modèle. Vous pouvez supprimer l’avertissement à l’aide de l’attribut gsl::suppress , comme illustré dans cet exemple :

class MyReferenceCountingObject final
{
public:
    void AddRef();
    void Release() noexcept
    {
        ref_count_--;
        if (ref_count_ == 0)
        {
            [[gsl::suppress(i.11)]]
            delete this; 
        }
    }
private:
    unsigned int ref_count_{1};
};