Partager via


C6280

Avertissement C6280 : <variable> est alloué avec <fonction>, mais supprimée avec <fonction>

Cet avertissement indique que la fonction d'appel a alloué de façon incohérente de la mémoire à l'aide d'une fonction d'une famille d'allocation de mémoire et l'a libérée à l'aide d'une fonction d'une autre famille d'allocation de mémoire.L'analyseur vérifie cette condition que lorsque l'annotation SAL d' _Analysis_mode_(_Analysis_local_leak_checks_) est spécifiée.Par défaut, cette annotation est spécifiée pour le code en mode noyau windows (pilote).Pour plus d'informations sur les annotations SAL, consultez l' Utilisation d'annotations SAL pour réduire les défauts du code C/C++.

Par exemple, cet avertissement est produit si la mémoire est allouée à l'aide de malloc mais libérée à l'aide de GlobalFree ou d' delete.Dans les cas spécifiques d'incompatibilités entre le tableau new[] et deletescalaire, des avertissements plus précis sont stockés au lieu 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 le code suivant :

// 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 du système, et des utilisations d' free le tas de processus.Cela risque de provoquer des altérations de la mémoire et se bloque.

Les incohérences s'appliquent à new/delete et malloc/mécanismes allocation de mémoire defree .Pour éviter ces types d'incohérences potentielles complètement, utilisez les mécanismes fournis par la bibliothèque de modèles Standard (STL) C++.Ceux-ci incluent shared_ptr, unique_ptr, et vecteur.Pour plus d'informations, consultez Pointeurs intelligents (C++ moderne) et Référence de la bibliothèque C++ standard.

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

Voir aussi

Référence

calloc

malloc

free

operator new (<new>)

opérateur delete (C++)

shared_ptr

unique_ptr

Concepts

Pointeurs intelligents (C++ moderne)