Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Избегайте вызовов
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};
};