Ostrzeżenie C26401
Nie usuwaj nieprzetworzonego wskaźnika, który nie jest wskaźnikiem
owner<T>
(i.11)
Uwagi
Ta kontrola wykrywa kod, w którym przejście do owner<T>
może być dobrym rozwiązaniem dla pierwszego etapu refaktoryzacji. Podobnie jak C26400, wymusza reguły I.11 i R.3, ale koncentruje się na części "release" okresu istnienia wskaźnika. Ostrzega przy każdym wywołaniu operatora delete
, jeśli jego element docelowy nie jest właścicielem owner<T>
lub niejawnie zakładanym właścicielem. Aby uzyskać więcej informacji na temat auto
deklaracji, zobacz C26400. Ta kontrola obejmuje wyrażenia odwołujące się do zmiennych globalnych, parametrów formalnych itd.
Ostrzeżenia C26400 i C26401 zawsze występują z C26409, ale są bardziej odpowiednie w scenariuszach, w których natychmiastowa migracja do inteligentnych wskaźników nie jest możliwa. W takich przypadkach owner<T>
można najpierw przyjąć koncepcję, a C26409 może zostać tymczasowo pominięta.
Nazwa analizy kodu: DONT_DELETE_NON_OWNER
Zobacz też
Podstawowe wytyczne dotyczące języka C++ I.11
Przykłady
struct myStruct {};
myStruct* createMyStruct();
void function()
{
myStruct* pMyStruct = createMyStruct();
// ...
delete pMyStruct; // C26401. Do not delete a raw pointer that is not an owner<T>
}
Zobacz, że C26401 jest usuwany, jeśli własność wskaźnika jest wskazywana przez gsl::owner.
#include <gsl/pointers>
struct myStruct {};
gsl::owner<myStruct*> createMyStruct();
void function()
{
gsl::owner<myStruct*> pMyStruct = createMyStruct();
// ...
delete pMyStruct; // no warning.
}
Istnieje idiom języka C++, który wyzwala to ostrzeżenie: delete this
. Ostrzeżenie jest zamierzone, ponieważ wytyczne podstawowe języka C++ odradzają ten wzorzec. Ostrzeżenie można pominąć przy użyciu atrybutu gsl::suppress
, jak pokazano w tym przykładzie:
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};
};
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla