Partilhar via


Aviso C26414

"Mova, copie, reatribua ou redefina um ponteiro inteligente local."

Diretrizes principais do C++:
R.5: Prefira objetos com escopo, não aloque heap-allocate desnecessariamente

Ponteiros inteligentes são convenientes para o gerenciamento dinâmico de recursos, mas nem sempre são necessários. Por exemplo, pode ser mais fácil e eficiente gerenciar um buffer dinâmico local usando um contêiner padrão. Para objetos individuais, pode não ser necessário usar alocação dinâmica, por exemplo, se eles nunca sobreviverem à função que os criou. Eles podem ser substituídos por variáveis locais. Ponteiros inteligentes tornam-se úteis quando um cenário requer uma mudança de propriedade. Por exemplo, quando você reatribui um recurso dinâmico várias vezes ou em vários caminhos. Eles também são úteis para recursos obtidos a partir de código externo. E, quando ponteiros inteligentes são usados para estender a vida útil de um recurso.

Observações

Esta verificação reconhece tanto os modelos padrão std::unique_pointer e std::shared_pointer, como os tipos definidos pelo utilizador que provavelmente são destinados a ser ponteiros inteligentes. Espera-se que esses tipos definam as seguintes operações:

  • operadores de desreferenciação ou acesso de membros sobrecarregados que são públicos e não marcados como excluídos;

  • um destrutor público que não é eliminado ou predefinido. Isso inclui destruidores explicitamente definidos como vazios.

O tipo Microsoft::WRL::ComPtr se comporta como um ponteiro compartilhado, mas geralmente é usado em cenários específicos que são afetados pelo gerenciamento do tempo de vida do COM. Para evitar ruído excessivo, este tipo é filtrado.

Essa verificação procura alocações locais explícitas atribuídas a ponteiros inteligentes, para identificar se as variáveis de escopo poderiam funcionar como uma alternativa. Tanto as chamadas diretas para o operador newcomo as funções especiais como std::make_unique e std::make_shared, são interpretadas como atribuições diretas.

Nome da análise de código: RESET_LOCAL_SMART_PTR

Exemplo

Buffer dinâmico:

void unpack_and_send(const frame &f)
{
    auto buffer = std::make_unique<char[]>(f.size()); // C26414
    f.unpack(buffer.get());
    // ...
}

Buffer dinâmico substituído por contêiner:

void unpack_and_send(const frame &f)
{
    auto buffer = std::vector<char>(f.size());
    f.unpack(buffer.data());
    // ...
}