Advertencia C6278

'variable' se asigna con la matriz nueva [], pero se elimina con la eliminación escalar. No se llamará a destructores.

Comentarios

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. Este uso no está definido según el estándar de C++ y la implementación de Microsoft C++.

Hay al menos tres razones por las que es probable que este error de coincidencia cause problemas:

  • Se invocan los constructores de los objetos individuales de la matriz, pero no se invocan los destructores.

  • Si es global o específico de la clase y operator deleteoperator new no son compatibles con operator new[] y operator delete[], es probable que se produzcan resultados inesperados.

  • Siempre es arriesgado confiar en un comportamiento indefinido.

Resulta difícil predecir con exactitud las ramificaciones de este defecto. Podría dar lugar a pérdidas para las clases con destructores que realizan la desasignación de memoria. Podría provocar un comportamiento incoherente para las clases con destructores que realizan alguna operación semánticamente significativa, o daños en la memoria y bloqueos cuando se han invalidado los operadores. En otros casos, puede ocurrir que la falta de correspondencia sea insignificante, dependiendo de la implementación del compilador y sus bibliotecas. Las herramientas de análisis no siempre pueden distinguir entre estas situaciones.

Si la memoria se asigna con la matriz new [], debe liberarse con la matriz delete[].

Nombre del análisis de código: ARRAY_NEW_DELETE_MISMATCH

Ejemplo

El código de ejemplo siguiente genera la advertencia C6278:

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, enumo puntero, no hay ningún destructor al que llamar. En estos casos, se notifica la advertencia C6283 en su lugar.

El uso de new y delete tiene muchos problemas en términos de fugas de memoria y excepciones. Para evitar estos tipos de posibles fugas por completo, use los mecanismos proporcionados por la biblioteca estándar de C++ (STL). Entre ellos se incluyen shared_ptrlos contenedores , unique_ptry , como vector. Para más información, consulte los artículos sobre punteros inteligentes y la biblioteca estándar de C++.