Compartilhar via


Aviso C26401

Não exclua um ponteiro bruto que não seja um owner<T> (i.11)

Comentários

Essa verificação detecta o código para onde mover pode owner<T> ser uma boa opção para o primeiro estágio da refatoração. Assim como no C26400, ele impõe as regras I.11 e R.3, mas se concentra na parte de "liberação" do tempo de vida do ponteiro. Ele avisa em qualquer chamada ao operador delete se o destino dele não for um owner<T> ou um proprietário presumido implicitamente. Para obter mais informações sobre declarações auto, confira C26400. Essa verificação inclui expressões que se referem a variáveis globais, parâmetros formais e assim por diante.

Os avisos C26400 e C26401 sempre ocorrem com C26409, mas são mais apropriados para cenários em que a migração imediata para ponteiros inteligentes não é viável. Nesses casos, o conceito owner<T> pode ser adotado primeiro e o C26409 pode ser suprimido temporariamente.

Nome da análise de código: DONT_DELETE_NON_OWNER

Confira também

Diretrizes Principais do C++ I.11

Exemplos

struct myStruct {};

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

Verifique que C26401 será removido se a propriedade do ponteiro for indicada por gsl::owner.

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

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

Há um idioma C++ que dispara esse aviso: delete this. O aviso é intencional, pois as Diretrizes Principais do C++ desencorajam esse padrão. Você pode suprimir o aviso usando o atributo gsl::suppress, conforme mostrado neste exemplo:

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