Avertissement C26409
Évitez d’appeler
new
etdelete
explicitement, utilisezstd::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
oudelete
: scalaire, vecteur, versions surchargées (globales et spécifiques à la classe) et versions de placement. Le cas de placementnew
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};
};