C6280
avertissement C6280 : <variable> est alloué avec <fonction>, mais supprimé avec <fonction>
Cet avertissement indique que la fonction d'appel a alloué de façon incohérente de la mémoire en appelant une fonction appartenant à une famille d'allocation de mémoire et l'a libérée en appelant une fonction d'une autre famille d'allocation de mémoire.L'analyseur vérifie cette condition uniquement lorsque l'annotations SAL _Analysis_mode_(_Analysis_local_leak_checks_) est spécifiée.Par défaut, cette annotation est spécifiée pour le code du mode noyau Windows (pilote).Pour plus d’informations sur les annotations SAL, voir Utilisation d'annotations SAL pour réduire les défauts du code C/C++.
Par exemple, cet avertissement se produit si la mémoire est allouée avec malloc mais libérée avec GlobalFree ou delete.Dans les cas spécifiques d'incompatibilités entre un tableau new[] et une variable scalaire delete, des avertissements plus précis s'affichent à la place de celui ci.
Exemple
L'exemple de code suivant génère cet avertissement.
// 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;
}
Pour corriger cet avertissement, utilisez ce 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);
}
Différentes définitions API peuvent utiliser différents tas.Par exemple, GlobalAlloc utilise le tas système, et free utilise le tas de processus.Cela risque de provoquer des altérations de la mémoire et des pannes.
Ces incohérences s'appliquent aux mécanismes new/delete et malloc/free d'allocation mémoire.Pour éviter entièrement ce genre d'incohérences potentielles, utilisez les mécanismes fournis par la bibliothèque de modèles standard (STL) C++.Ceux-ci incluent shared_ptr, unique_ptr, et vector.Pour plus d’informations, consultez Pointeurs intelligents (Modern C++) et Référence de bibliothèque standard 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.
}