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 delete
no 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 free
de 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_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++.
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
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