Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Избегайте вызовов
newиdeleteявно используйтеstd::make_unique<T>вместо него (r.11).
Даже если код чист от вызовов malloc и free, мы по-прежнему рекомендуем рассмотреть лучшие варианты, чем явное использование операторовnewиdelete.
Основные рекомендации по C++
R.11: избегайте вызовов new и delete явно
Конечное исправление заключается в использовании смарт-указателей и соответствующих функций фабрики, таких как 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};
};