Поделиться через


Предупреждение C26409

Избегайте вызовов new и delete явно используйте std::make_unique<T> вместо него (r.11).

Даже если код чист от вызовов malloc и free, мы по-прежнему рекомендуем рассмотреть лучшие варианты, чем явное использование операторовnew иdelete.

Основные рекомендации по C++
R.11. Избегайте вызова новых и удаления явным образом

Конечное исправление заключается в использовании смарт-указателей и соответствующих функций фабрики, таких как std::make_unique.

Замечания

  • Средство проверки предупреждает о вызовах любого типа оператора new или delete: скалярных, векторных, перегруженных версий (глобальных и конкретных классов) и версий размещения. В случае размещения new может потребоваться некоторое уточнение в основных рекомендациях по предлагаемым исправлениям и может быть опущено в будущем.

Имя анализа кода: NO_NEW_DELETE

Примеры

В этом примере показано, как создается C26409 для явного new и delete. Рекомендуется использовать функции фабрики смарт-указателей, например std::make_unique вместо этого.

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
}

Существует идиом C++, который активирует это предупреждение: delete this Предупреждение намеренно, так как основные рекомендации C++ препятствуют этому шаблону. Предупреждение можно отключить с помощью атрибута gsl::suppress , как показано в следующем примере:

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};
};