Advertencia C26409
Evite llamar a
new
ydelete
explícitamente, usestd::make_unique<T>
en su lugar (r.11).
Incluso si el código está limpio de llamadas a malloc
y free
, seguimos sugiriendo que considere mejores opciones que el uso explícito de operadores new
y delete
.
C++ Core Guidelines:
R.11: Evitar llamar a new y delete explícitamente
La solución definitiva es usar punteros inteligentes y funciones de fábrica adecuadas, como std::make_unique
.
Comentarios
- El comprobador advierte de las llamadas a cualquier tipo de operador
new
odelete
: escalar, vectorial, versiones sobrecargadas (globales y específicas de clase) y versiones de selección de ubicación. El caso de selección de ubicaciónnew
puede requerir algunas aclaraciones de las correcciones sugeridas en Core Guidelines y puede omitirse en el futuro.
Nombre de análisis de código: NO_NEW_DELETE
Ejemplos
En este ejemplo se muestra que se genera la advertencia C26409 para los operadores new
y delete
explícitos. Considere la posibilidad de usar en su lugar funciones de fábrica de punteros inteligentes, como 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
}
Hay una expresión de C++ que desencadena esta advertencia: delete this
. La advertencia es intencionada, ya que en C++ Core Guidelines se desaconseja este patrón. Puede suprimir la advertencia mediante el atributo gsl::suppress
, como se muestra en este ejemplo:
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};
};