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.
Evite ligar
newedeleteexplicitamente; usestd::make_unique<T>em seu lugar (r.11).
Mesmo que o código esteja limpo de chamadas para malloc e free, ainda sugerimos que você considere opções melhores do que o uso explícito de operadores new e delete.
Diretrizes principais do C++:
R.11: Evite chamar new e delete explicitamente
A solução definitiva é usar ponteiros inteligentes e funções de fábrica apropriadas, como std::make_unique.
Observações
- O verificador avisa sobre chamadas para qualquer tipo de operador
newoudelete: escalar, vetorial, versões sobrecarregadas (global e específicas da classe) e versões de posicionamento. O caso de colocaçãonewpode exigir alguns esclarecimentos nas Diretrizes Principais para correções sugeridas e pode ser omitido no futuro.
Nome da análise de código: NO_NEW_DELETE
Exemplos
Este exemplo mostra que C26409 é gerado para new e delete de forma explícita. Em vez disso, considere usar funções de fábrica de ponteiros 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
}
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};
};