Compartir vía


Advertencia C26401

No elimine un puntero sin formato que no sea ( owner<T> i.11)

Comentarios

Esta comprobación detecta código al que mover a owner<T> puede ser una buena opción para la primera fase de refactorización. Al igual que C26400, aplica las reglas I.11 y R.3, pero se centra en la parte de "versión" de la duración del puntero. Advierte sobre cualquier llamada al operador delete si su destino no es owner<T> o un propietario asumido implícitamente. Para más información sobre las declaraciones auto, consulte C26400. Esta comprobación incluye expresiones que hacen referencia a variables globales, parámetros formales, etc.

Las advertencias C26400 y C26401 siempre se producen con C26409, pero son más adecuadas para escenarios en los que la migración inmediata a punteros inteligentes no es factible. En tales casos, el concepto owner<T> se puede adoptar primero y C26409 puede suprimirse temporalmente.

Nombre del análisis de código: DONT_DELETE_NON_OWNER

Consulte también

C++ Core Guidelines I.11

Ejemplos

struct myStruct {};

myStruct* createMyStruct();
void function()
{
    myStruct* pMyStruct = createMyStruct();
    // ...
    delete pMyStruct; // C26401. Do not delete a raw pointer that is not an owner<T>
}

Vea que C26401 se quita si la propiedad del puntero se indica mediante gsl::owner.

#include <gsl/pointers>
struct myStruct {};

gsl::owner<myStruct*> createMyStruct();
void function()
{
    gsl::owner<myStruct*> pMyStruct = createMyStruct();
    // ...
    delete pMyStruct; // no warning.
}

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