Upozornění C26401
Neodstraňovat nezpracovaný ukazatel, který není
owner<T>
(i.11)
Poznámky
Tato kontrola detekuje kód, na owner<T>
kterém může být přechod dobrou volbou pro první fázi refaktoringu. Podobně jako C26400 vynucuje pravidla I.11 a R.3, ale zaměřuje se na část životnosti ukazatele vydané verze. Upozorní na jakékoli volání operátora delete
, pokud jeho cílem není owner<T>
nebo implicitně předpokládaný vlastník. Další informace o auto
deklaracích najdete v tématu C26400. Tato kontrola zahrnuje výrazy, které odkazují na globální proměnné, formální parametry atd.
Upozornění C26400 a C26401 se vždy vyskytují u C26409, ale jsou vhodnější pro scénáře, kdy okamžitá migrace na inteligentní ukazatele není možná. V takových případech owner<T>
lze nejprve přijmout koncept a C26409 může být dočasně potlačena.
Název analýzy kódu: DONT_DELETE_NON_OWNER
Viz také
Příklady
struct myStruct {};
myStruct* createMyStruct();
void function()
{
myStruct* pMyStruct = createMyStruct();
// ...
delete pMyStruct; // C26401. Do not delete a raw pointer that is not an owner<T>
}
Podívejte se, že C26401 je odebrán, pokud je vlastnictví ukazatele označeno gsl::owner.
#include <gsl/pointers>
struct myStruct {};
gsl::owner<myStruct*> createMyStruct();
void function()
{
gsl::owner<myStruct*> pMyStruct = createMyStruct();
// ...
delete pMyStruct; // no warning.
}
Existuje idiom C++, který aktivuje toto upozornění: delete this
. Upozornění je záměrné, protože pokyny jazyka C++ Core tento vzor nedoporučuje. Upozornění můžete potlačit pomocí atributu gsl::suppress
, jak je znázorněno v tomto příkladu:
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};
};