Compartilhar via


C6278

Aviso C6278: <variável>é alocado com [] de novo array, mas excluído com excluir escalar.Destruidores não serão chamados

Esse aviso é exibido somente no código C++ e indica que a função chamada inconsistentemente alocou memória com a matriz [novo] operador, mas o liberado com a escalar Excluir operador.Este é um comportamento indefinido de acordo com ao padrão C++ e a implementação Microsoft VC ++.Há pelo menos três razões que isso pode causar problemas:

  • Os construtores para os objetos individuais da matriz são chamados, mas os destruidores não são invocados. 

  • Se global ou específico de classe, operador novo and Excluir operador não são compatível com o operador de [novo and operador delete, resultados inesperados têm probabilidade de ocorrer.

  • Sempre é muito arriscado contam com um comportamento indefinido.

As ramificações exatas desse defeito são difíceis de prever.Ele pode resultar em vazamentos de classes com destruidores executam desalocação de memória; um comportamento divergente para as classes com destruidores realizar alguma operação semanticamente significativa; ou corrupção de memória e travamentos quando operadores foram substituídos.Em outros casos a incompatibilidade pode ser 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 [novo], ele deve ser normalmente ser liberado com matriz Excluir.

Exemplo

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

class A
{
  // members
};

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

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

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

Se o objeto subjacente na matriz é um tipo primitivo, sistema autônomo int, float, enum, ou de ponteiro, não há nenhum destruidores seja chamado. Nesses casos aviso C6283 é relatado em vez disso.