Compartilhar via


C6278

Aviso C6278: <variável> é atribuída com a matriz new [], mas excluída com scalar delete.Os destruidores não serão chamados

Esse aviso aparece apenas em código C++ e indica que a função de chamada atribuiu memória de maneira inconsistente com o operador de matriz novo [] , mas liberou com o operador de escala excluir.Esse é um comportamento indefinido de acordo com o padrão C++ e a implementação do Microsoft Visual C++.Há, pelo menos, três razões para isso provavelmente causar problemas:

  • Os construtores dos objetos individuais na matriz são invocados, embora os destruidores não sejam. 

  • Se o novo operador e o deletor de operador globais ou específicos da classe não forem compatíveis com o novo[] operador e o deletor[] de operador, é muito provável que ocorram resultados inesperados.

  • Sempre é muito arriscado confiar em comportamento indefinido.

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

Se a memória for atribuída com a matriz nova [], geralmente, ela será liberada com a 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 seguinte código de exemplo:

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

Se o objeto subjacente na matriz for um tipo primitivo como int, float, enum, ou ponteiro, não há destrutor a ser chamado.O aviso C6283 é relatado nesses casos em vez disso.

O uso de new e delete tem muitas armadilhas em termos de vazamentos de memória e exceções.Para evitar esses tipos de vazamentos e problemas de exceção no geral, use os mecanismos que são fornecidos pela STL (Biblioteca de Modelos Padrão) do C++.Incluem shared_ptr, unique_ptr e vector.Para obter mais informações, consulte Ponteiros inteligentes (C++ moderno) e Referência da Biblioteca Padrão C++.