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 delete
operator new
no son compatibles conoperator new[]
yoperator 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
, enum
o 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_ptr
los contenedores , unique_ptr
y , como vector
. Para más información, consulte los artículos sobre punteros inteligentes y la biblioteca estándar de C++.
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de