Avviso C26401
Non eliminare un puntatore
owner<T>
non elaborato diverso da (ad esempio 11)
Osservazioni:
Questo controllo rileva il codice in cui lo spostamento in owner<T>
può essere un'opzione valida per la prima fase del refactoring. Come C26400, applica le regole I.11 e R.3, ma si concentra sulla parte "release" della durata del puntatore. Avvisa su qualsiasi chiamata a un operatore delete
se la destinazione non è o owner<T>
un proprietario assunto in modo implicito. Per altre informazioni sulle auto
dichiarazioni, vedere C26400. Questo controllo include espressioni che fanno riferimento a variabili globali, parametri formali e così via.
Gli avvisi C26400 e C26401 si verificano sempre con C26409, ma sono più appropriati per gli scenari in cui la migrazione immediata ai puntatori intelligenti non è fattibile. In questi casi, il owner<T>
concetto può essere adottato per primo e C26409 può essere temporaneamente eliminato.
Nome dell'analisi del codice: DONT_DELETE_NON_OWNER
Vedi anche
Linee guida di base di C++I.11
Esempi
struct myStruct {};
myStruct* createMyStruct();
void function()
{
myStruct* pMyStruct = createMyStruct();
// ...
delete pMyStruct; // C26401. Do not delete a raw pointer that is not an owner<T>
}
Vedere che C26401 viene rimosso se la proprietà del puntatore è indicata da gsl::owner.
#include <gsl/pointers>
struct myStruct {};
gsl::owner<myStruct*> createMyStruct();
void function()
{
gsl::owner<myStruct*> pMyStruct = createMyStruct();
// ...
delete pMyStruct; // no warning.
}
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};
};