Avviso C26409
Evitare di chiamare
new
edelete
usare in modo esplicitostd::make_unique<T>
(r.11).
Anche se il codice è pulito dalle chiamate a e , è comunque consigliabile prendere in considerazione opzioni migliori rispetto all'uso malloc
esplicito di operatori new
e delete
.free
Linee guida di base per C++:
R.11: Evitare di chiamare nuovi ed eliminare in modo esplicito
La correzione finale consiste nell'usare puntatori intelligenti e funzioni di factory appropriate, ad esempio std::make_unique
.
Osservazioni:
- Il controllo avvisa le chiamate a qualsiasi tipo di operatore
new
odelete
: scalare, vettore, versioni di overload (specifiche della classe e globale) e versioni di posizionamento. Il caso di posizionamentonew
potrebbe richiedere alcuni chiarimenti nelle linee guida di base per le correzioni suggerite e potrebbe essere omesso in futuro.
Nome dell'analisi del codice: NO_NEW_DELETE
Esempi
Questo esempio mostra che C26409 viene generato per esplicito new
e delete
. Prendere in considerazione l'uso di funzioni factory del puntatore intelligente, std::make_unique
ad esempio .
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
}
Esiste un linguaggio C++ che attiva questo avviso: delete this
. L'avviso è intenzionale, perché le linee guida di base di C++ sconsigliano questo modello. È possibile eliminare l'avviso usando l'attributo gsl::suppress
, come illustrato in questo esempio:
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};
};