Предупреждение 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};
};