C6280
Advertencia C6280: <variable> está asignado a <función>, pero eliminado con <función>
Esta advertencia indica que la función de llamada ha asignado memoria de manera incoherente al usar una función de una familia de asignación de memoria para asignarla y otra distinta para liberarla.El analizador comprueba esta condición solo cuando se especifica la anotación SAL _Analysis_mode_(_Analysis_local_leak_checks_).De forma predeterminada, esta anotación se especifica para el código del modo kernel de Windows (controlador).Para obtener más información sobre las anotaciones SAL, consulte Utilizar anotaciones SAL para reducir defectos de código de C/C++.
Por ejemplo, esta advertencia se genera si la memoria se asigna mediante malloc pero se libera con GlobalFree o delete.En los casos concretos de falta de concordancia entre new[] de matriz y delete de escalar, se notifican advertencias más precisas en lugar de esta.
Ejemplo
El siguiente ejemplo de código genera esta advertencia.
// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
_Analysis_mode_(_Analysis_local_leak_checks_)
void f(int arraySize)
{
int *pInt = (int *)calloc(arraySize, sizeof (int));
// code ...
delete pInt;
}
Para corregir esta advertencia, use este código:
// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
_Analysis_mode_(_Analysis_local_leak_checks_)
void f(int arraySize)
{
int *pInt = (int *)calloc(arraySize, sizeof (int));
// code ...
free(pInt);
}
Definiciones de API diferentes pueden utilizar montones distintos.Por ejemplo, GlobalAlloc usa el montón del sistema y free usa el montón del proceso.Es probable que esto produzca daños en la memoria y bloqueos.
Estas incoherencias se aplican a los mecanismos de asignación de memoria new/delete y malloc/free.Para evitar todos estos tipos de posibles incoherencias, 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++.
// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <vector>
#include <memory>
using namespace std;
_Analysis_mode_(_Analysis_local_leak_checks_)
void f(int arraySize)
{
// use unique_ptr instead of calloc/malloc/new
unique_ptr<int[]> pInt(new int[arraySize]);
// code ...
// No need for free because unique_ptr
// cleans up when out of scope.
}