C6278

C6278 de aviso: <variable> é atribuído com a nova matriz [], mas excluído com excluir único.Os destruidores não serão chamados

Este aviso aparece apenas em código C++ e indica que a função de chamada incompatìvel atribuiu a memória com o operador de novo [] de matriz, mas ela lançado com o operador escalar de delete .Este comportamento é indefinido de acordo com o padrão C++ e a implementação do Microsoft Visual C++.Há pelo menos três comerciais que isso é provável causar problemas:

  • Construtores para os objetos individuais na matriz são invocados, mas os destruidores não serão chamados. 

  • Se global, ou específico de classe, operador novo e supressão de operador não é compatível com operador novo [] e **supressão de operador []**resultados inesperados, é provável de ocorrer.

  • Sempre é muito arriscado confiar em comportamento indefinido.

As ramificação exatas de este empecilho são difíceis de prever.Pode resultar em vazamentos para classes com os destruidores que executam a liberação de memória; comportamento inconsistente para classes com os destruidores que executam qualquer operação semanticamente significativa; os ou danos e falhas de memória quando os operadores são substituídos.Em outros casos a incompatibilidade pode ser sem importância, dependendo da implementação do compilador e das bibliotecas.A ferramenta de análise não pode sempre distinguir entre essas situações.

Se a memória é atribuída a matriz novo [], deve ser normalmente é liberada com matriz excluir [].

Exemplo

O seguinte exemplo de código gera este aviso:

class A
{
  // members
};

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

Para corrigir este 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 como int, float, enum, ou o ponteiro, não há destrutor a ser chamado.Aviso C6283 é relatada em esses casos o lugar.