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.
Prefira objetos com escopo, não aloque no heap desnecessariamente (r.5)
Para evitar o uso desnecessário de ponteiros, tentamos detetar padrões comuns de alocações locais. Por exemplo, detetamos quando o resultado de uma chamada para o operador new é armazenado em uma variável local e posteriormente excluído explicitamente. Esta verificação suporta a regra R.5 das Diretrizes Principais do C++: Prefira objetos com escopo, não aloque no heap desnecessariamente. Para corrigir o problema, use um tipo RAII em vez de um ponteiro cru e deixe que ele gerencie os recursos. Obviamente, não é necessário criar um tipo de wrapper para alocar um único objeto. Em vez disso, uma variável local do tipo do objeto funcionaria melhor.
Observações
Para reduzir o número de avisos, a análise de código deteta esse padrão apenas para ponteiros proprietários. Por isso, é necessário marcar os proprietários corretamente primeiro. Podemos facilmente estender essa análise para cobrir ponteiros brutos se recebermos comentários sobre a Comunidade de Desenvolvedores do Visual Studio C++ de clientes em suporte a tais cenários.
O termo objeto delimitado pode ser ligeiramente confuso. Em geral, sugerimos que você use uma variável local cujo tempo de vida é gerenciado automaticamente ou um objeto inteligente que gerencia recursos dinâmicos de forma eficiente. Objetos inteligentes podem fazer alocações de heap, mas isso não está explícito no código.
Se o aviso for acionado na alocação de matriz, que geralmente é necessária para buffers dinâmicos, você poderá corrigi-lo usando contêineres padrão ou
std::unique_pointer<T[]>.O padrão é detetado apenas para variáveis locais. Não avisamos nos casos em que uma alocação é atribuída, digamos, a uma variável global e, em seguida, excluída na mesma função.
Nome da análise de código: DONT_HEAP_ALLOCATE_UNNECESSARILY
Exemplo 1: Alocação desnecessária de objetos em heap
auto tracer = new Tracer();
ScanObjects(tracer);
delete tracer; // C26407
Exemplo 2: Alocação desnecessária de objetos em heap (corrigida com objeto local)
Tracer tracer; // OK
ScanObjects(&tracer);
Exemplo 3: Alocação desnecessária de buffer no heap
auto value = new char[maxValueSize];
if (ReadSetting(name, value, maxValueSize))
CheckValue(value);
delete[] value; // C26407
Exemplo 4: Alocação desnecessária de buffer na pilha (corrigida com contêiner)
auto value = std::vector<char>(maxValueSize); // OK
if (ReadSetting(name, value.data(), maxValueSize))
CheckValue(value.data());