Partage via


Avertissement C26401

Ne supprimez pas un pointeur brut qui n’est pas un owner<T> (i.11)

Notes

Cette case activée détecte le code dans lequel le déplacement owner<T> peut être une bonne option pour la première phase de refactorisation. Comme C26400, il applique les règles I.11 et R.3, mais se concentre sur la partie « mise en production » de la durée de vie du pointeur. Il avertit sur n’importe quel appel à l’opérateur delete si sa cible n’est pas un owner<T> ou un propriétaire implicitement supposé. Pour plus d’informations sur les auto déclarations, consultez C26400. Cette case activée inclut des expressions qui font référence à des variables globales, des paramètres formels, et ainsi de suite.

Les avertissements C26400 et C26401 se produisent toujours avec C26409, mais ils sont plus appropriés pour les scénarios où la migration immédiate vers des pointeurs intelligents n’est pas réalisable. Dans ce cas, le owner<T> concept peut être adopté en premier, et C26409 peut être temporairement supprimé.

Nom de l’analyse du code : DONT_DELETE_NON_OWNER

Voir aussi

Instructions principales C++ I.11

Exemples

struct myStruct {};

myStruct* createMyStruct();
void function()
{
    myStruct* pMyStruct = createMyStruct();
    // ...
    delete pMyStruct; // C26401. Do not delete a raw pointer that is not an owner<T>
}

Vérifiez que C26401 est supprimé si la propriété du pointeur est indiquée par gsl ::owner.

#include <gsl/pointers>
struct myStruct {};

gsl::owner<myStruct*> createMyStruct();
void function()
{
    gsl::owner<myStruct*> pMyStruct = createMyStruct();
    // ...
    delete pMyStruct; // no warning.
}

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