Compartilhar via


C6278

Aviso C6278: <variable> é alocada com array [novo], mas excluídos com a exclusão de escalar. Não serão chamados destruidores

Esse aviso aparece somente no código em C++ e indica que a função de chamada tem inconsistentemente memória alocada com a matriz [] a nova operador, mas o liberado com a scalar Excluir operador. Este é um comportamento indefinido de acordo com o padrão C++ e a implementação do Microsoft VC + +. Há pelo menos três razões para que esta é a probabilidade de causar problemas:

  • Os construtores de objetos individuais da matriz são invocados, mas os destrutores não são invocados. 

  • Se global ou específico de classe, novo operador e Excluir do operador não são compatíveis com [] de novo operador e operador excluir [, resultados inesperados provavelmente ocorrerão.

  • Sempre é muito arriscado depender de um comportamento indefinido.

As ramificações exatas deste defeito são difíceis de prever. Isso pode resultar em vazamentos de classes com destruidores executam desalocação de memória; comportamento inconsistente para classes de destruidores realizam alguma operação semanticamente significativa; ou corrupções de memória e travamentos quando operadores tem sido substituídos. Em outros casos, a incompatibilidade talvez sem importância, dependendo da implementação do compilador e suas bibliotecas. Ferramenta de análise sempre não consegue distinguir entre essas situações.

Se a memória é alocada com matriz [] a nova, ele deve ser normalmente ser liberado com matriz Excluir [.

Exemplo

O exemplo de código a seguir gera este aviso:

class A
{
  // members
};

void f( )
{
  A *pA = new A[5];
  // code ...
  delete pA;
}

Para corrigir esse aviso, use o exemplo de código a seguir:

void f( )
{
  A *pA = new A[5];
  // code ...
  delete[] pA;
}

Se o objeto subjacente na matriz é um tipo primitivo como int, float, enum, ou o ponteiro, não há nenhum destruidores para ser chamado. Nesses casos aviso C6283 é relatado em vez disso.