Compartir a través de


C6278

Actualización: noviembre 2007

C6278

Advertencia C6278: <variable> está asignado con 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 la norma de C++ y la implementación de Microsoft VC++. Existen al menos tres razones por las que es probable que este uso produzca problemas:

  • Se invocan los constructores de los objetos individuales en 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.