Upozornění C26409
Vyhněte se volání
new
adelete
explicitně, použijtestd::make_unique<T>
místo toho (r.11).
I když je kód čistý volání malloc
a , stále doporučujeme zvážit lepší možnosti než explicitní použití operátorůnew
a delete
.free
Pokyny pro C++ Core:
R.11: Vyhněte se volání nových a odstranění explicitně
Konečným řešením je použití inteligentních ukazatelů a vhodných funkcí továrny, například std::make_unique
.
Poznámky
- Kontrola varuje při volání jakéhokoli typu operátoru
new
nebodelete
: skalární, vektorové, přetížené verze (globální a specifické třídy) a verze umístění. Případ umístěnínew
může vyžadovat určité objasnění v základních pokynech pro navrhované opravy a může být vynechán v budoucnu.
Název analýzy kódu: NO_NEW_DELETE
Příklady
Tento příklad ukazuje C26409 je vyvolána pro explicitní new
a delete
. Zvažte použití funkcí pro vytváření inteligentních ukazatelů, například std::make_unique
místo toho.
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
}
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};
};