Partilhar via


Aviso C26407

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());