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.