Advertencia C26409

Evite llamar a new y delete explícitamente, use std::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 o delete: 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ón new puede requerir algunas aclaraciones de las correcciones sugeridas en Core Guidelines y puede omitirse en el futuro.

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