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.