Sdílet prostřednictvím


Upozornění C26409

Vyhněte se volání new a delete explicitně, použijte std::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 nebo delete: 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};
};