C6280C6280

Advertencia C6280: <variable > se asigna con <función >, pero se han eliminado con <función >warning C6280: <variable> is allocated with <function>, but deleted with <function>

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.This warning indicates that the calling function has inconsistently allocated memory by using a function from one memory allocation family and freed it by using a function from another memory allocation family. El analizador comprueba esta condición solo cuando se especifica la anotación SAL _Analysis_mode_(_Analysis_local_leak_checks_).The analyzer checks for this condition only when the _Analysis_mode_(_Analysis_local_leak_checks_) SAL annotation is specified. De forma predeterminada, esta anotación se especifica para el código del modo kernel de Windows (controlador).By default, this annotation is specified for Windows kernel mode (driver) code. Para obtener más información acerca de las anotaciones de SAL, consulte utilizar anotaciones SAL para reducir defectos de código de C o C++.For more information about SAL annotations, see Using SAL Annotations to Reduce C/C++ Code Defects.

Por ejemplo, esta advertencia se genera si la memoria se asigna mediante malloc pero se libera con GlobalFree o delete.For example, this warning would be produced if memory is allocated by using malloc but freed by using GlobalFree or 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.In the specific cases of mismatches between array new[] and scalar delete, more precise warnings are reported instead of this one.

EjemploExample

El siguiente ejemplo de código genera esta advertencia.The following sample code generates this warning.

// 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:To correct this warning, use this code:

// 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.Different API definitions can use different heaps. Por ejemplo, GlobalAlloc usa el montón del sistema y free usa el montón del proceso.For example, GlobalAlloc uses the system heap, and free uses the process heap. Es probable que esto produzca daños en la memoria y bloqueos.This is likely to cause memory corruptions and crashes.

Estas incoherencias se aplican a la new / delete y malloc / free mecanismos de asignación de memoria.These inconsistencies apply to the new/delete and malloc/free memory allocation mechanisms. Para evitar todos estos tipos de posibles incoherencias, use los mecanismos proporcionados por la Biblioteca de plantillas estándar (STL) de C++.To avoid these kinds of potential inconsistencies altogether, use the mechanisms that are provided by the C++ Standard Template Library (STL). Puede tratarse de shared_ptr, unique_ptr, y vector.These include shared_ptr, unique_ptr, and vector. Para obtener más información, consulte punteros inteligentes y biblioteca estándar de C++.For more information, see Smart Pointers and C++ Standard Library.

// 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énSee Also

calloc calloc
malloc malloc
free free
new (operador) operator new
Delete (operador) delete Operator
shared_ptr shared_ptr
unique_ptr unique_ptr
Punteros inteligentesSmart Pointers