C6279
Advertencia C6279: <variable> está asignado al nuevo escalar, pero se eliminará con la eliminación de matriz []
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 escalar new, pero la ha liberado con el operador de matriz delete [].Si la memoria se asigna con el escalar nuevo, lo normal es liberarla con la eliminación escalar.
Existen al menos tres razones por las que es probable que este uso produzca problemas:
No se invocan los constructores de los objetos individuales de la matriz, pero sí 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.
Resulta difícil predecir con exactitud las ramificaciones de este defecto.Podría provocar un comportamiento aleatorio o bloqueos, debido al uso de memoria que no se ha inicializado al no haberse invocado los constructores.También podría producir asignaciones de memoria y bloqueos en situaciones en que se han reemplazado los operadores.En muy pocos casos esta desigualdad puede no tener importancia.La herramienta de análisis no distingue actualmente entre estas situaciones.
Ejemplo
El código siguiente genera esta advertencia:
class A
{
// members
};
void f ( )
{
A *pA = new A;
//code ...
delete[] pA;
}
Para corregir esta advertencia, utilice el código siguiente:
void f( )
{
A *pA = new A;
//code ...
delete pA;
}
Para evitar todos estos tipos de problemas de asignación, 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++.