Compartir a través de


C6280

Advertencia C6280: <variable> está asignado a <función>, pero eliminado con <función>

Esta advertencia indica que la función que llama ha asignado memoria mediante una función de una familia de asignación de memoria y la ha liberado mediante una función de otra familia de asignación de memoria.Comprueba el analizador esta condición sólo cuando se especifica la anotación de _Analysis_mode_(_Analysis_local_leak_checks_) SAL.De forma predeterminada, esta anotación se especifica para el código en modo kernel de Windows (controlador).Para obtener más información sobre las anotaciones SAL, vea Utilizar anotaciones SAL para reducir defectos de código de C/C++.

Por ejemplo, se genera esta advertencia si la memoria se asigna con malloc pero se libera mediante GlobalFree o delete.En los casos concretos de falta de concordancia entre la matriz new[] y delete escalar, advertencias más precisas se comunican en lugar this.

Ejemplo

El código siguiente 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, utilice 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 utiliza el montón sistema, y free utiliza el montón de proceso.Es probable que esto produzca daños en la memoria y bloqueos.

Estas incoherencias se aplican a new/delete y malloc/mecanismos de asignación de memoria de free.Para evitar estas clases de inconsistencias potenciales en conjunto, utilice los mecanismos proporcionados por la biblioteca estándar (STL) de plantillas de C++.Estos incluyen shared_ptr, unique_ptr, y vector.Para obtener más información, vea Punteros inteligentes (C++ moderno) y Referencia de la 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.
}

Vea también

Referencia

calloc

malloc

free

operator new (<new>)

operador delete (C++)

shared_ptr

unique_ptr

Conceptos

Punteros inteligentes (C++ moderno)