Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Não exclua um ponteiro bruto que não seja um
owner<T>(i.11)
Observações
Essa verificação deteta o código para onde mover pode owner<T> ser uma boa opção para o primeiro estágio de refatoração. Como o 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 para o operador delete se o seu alvo não é um owner<T> ou um proprietário implicitamente assumido. Para obter mais informações sobre auto declarações, consulte 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 pode ser adotado primeiro, e C26409 owner<T> pode ser temporariamente suprimido.
Nome da análise de código: DONT_DELETE_NON_OWNER
Ver 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>
}
Veja que C26401 é 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á uma linguagem C++ que dispara este aviso: delete this. O aviso é intencional, porque as Diretrizes Básicas do C++ desencorajam esse padrão. Você pode suprimir o aviso usando o gsl::suppress atributo, 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};
};