C6278
Advertencia C6278: <variable> está asignado a la nueva matriz [], pero se eliminará con la eliminación escalar.No se llamará a los destructores
Esta advertencia sólo aparece en el código de C++ e indica que la función que llama ha asignado memoria de manera inconsistente con el operador de matriz new [], pero lo ha liberado con el operador delete.Se trata de un comportamiento no definido de conformidad con el estándar C++ y la implementación de Microsoft Visual C++.Existen al menos tres razones por las que es probable que este uso produzca problemas:
Se invocan los constructores de objetos específicos de la matriz, pero no se invocan los destructores.
Si los operadores globales (o específicos de las clases) new y delete no son compatibles con los operadores new[] y delete[], es probable que se produzcan resultados inesperados.
Siempre es muy arriesgado confiar en comportamiento no definido.
Resulta difícil predecir con exactitud las ramificaciones de este defecto.Puede provocar pérdidas para las clases con destructores que realicen operaciones de desasignación de memoria; comportamiento incoherente para las clases con destructores que realicen alguna operación significativa desde el punto de vista semántico; o dañar y bloquear la memoria cuando se reemplacen los operadores.En otros casos, puede ocurrir que la falta de correspondencia sea insignificante, dependiendo de la implementación del compilador y sus bibliotecas.La herramienta de análisis no siempre distingue entre estas situaciones.
Si la memoria se asigna con la matriz nuevo [], se debe liberar con la matriz delete [].
Ejemplo
El siguiente ejemplo de código genera esta advertencia:
class A
{
// members
};
void f( )
{
A *pA = new A[5];
// code ...
delete pA;
}
Para corregir esta advertencia, utilice el siguiente código de ejemplo:
void f( )
{
A *pA = new A[5];
// code ...
delete[] pA;
}
Si el objeto subyacente de la matriz es un tipo primitivo, como int, float, enum o un puntero, no existen destructores a los que llamar.En estos casos, se muestra la advertencia C6283.
El uso de las opciones new y delete tiene muchos riesgos en cuanto a pérdidas de memoria y excepciones.Para evitar todos estos tipos de problemas de pérdidas de memoria y excepciones, use los mecanismos proporcionados por la Biblioteca de plantillas estándar (STL) de C++.Estos incluyen shared_ptr, unique_ptr y vector.Para obtener más información, vea Punteros inteligentes (C++ moderno) y Referencia de biblioteca estándar de C++.