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 d’appels à malloc et , nous vous suggérons toujours de considérer de meilleures options que l’utilisation explicite d’opérateurs new et delete.free

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 case activée er 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};
};