Advertencia C6280

'nombre-variable' se asigna con 'function-name-1', pero se elimina con 'function-name-2'

Esta advertencia indica que la función de llamada tiene memoria asignada incoherentemente mediante una función de una familia y la libera mediante una función de otra.

Comentarios

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 más información sobre el uso de anotaciones SAL, consulte Uso de anotaciones SAL para reducir los defectos en el 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.

Nombre del análisis de código: MEMORY_ALLOCATION_MISMATCH

Ejemplo

El siguiente ejemplo de código genera esta advertencia. pInt se asigna mediante calloc pero se libera mediante la función deleteno coincidente :

// C6280a_warning.cpp
// 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;
}

El código siguiente evita esta advertencia mediante la función freede desasignación , la coincidencia con calloc:

// C6280a_no_warning.cpp
// 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 este problema cause 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 estos tipos de posibles incoherencias 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++.

El código siguiente evita este problema por completo mediante unique_ptr:

// C6280b_no_warning.cpp
// 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.
}

Consulte también

calloc
malloc
free
operator new
Operador delete
shared_ptr
unique_ptr
Punteros inteligentes