Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Vyhněte se volání
newadeleteexplicitně, 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ůfreenew.delete
Pokyny pro C++ Core:
R.11: Vyhněte se volání new a delete 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
newnebodelete: skalární, vektorové, přetížené verze (globální a specifické třídy) a verze umístění. Případ umístěnínewmůž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};
};