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++.