Partager via


C6014

avertissement C6014 : Fuite de la mémoire.

Cet avertissement indique que le pointeur spécifié pointe vers la mémoire allouée ou une autre ressource allouée qui n'a pas été libérée.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++.

Exemple

Le code suivant génère cet avertissement :

// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
#include <string.h>

_Analysis_mode_(_Analysis_local_leak_checks_) 
 
#define ARRAYSIZE 10
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};
 
void f( )
{
    int *p = (int *)malloc(sizeof(int)*ARRAYSIZE);
    if (p) {
        memcpy(p, TEST_DATA, sizeof(int)*ARRAYSIZE);
        // code ...
    }
}
 
int main( )
{
    f();
}
 

Le code suivant corrige l'avertissement en libérant la mémoire :

// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
#include <string.h>

_Analysis_mode_(_Analysis_local_leak_checks_) 

#define ARRAYSIZE 10
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};
 
void f( )
{
    int *p = (int *)malloc(sizeof(int)*ARRAYSIZE);
    if (p) {
        memcpy(p, TEST_DATA, sizeof(int)*ARRAYSIZE);
        // code ...
        free(p);
    }
}
 
int main( )
{
    f();
}

Cet avertissement apparaît pour les fuites de mémoire et de ressource lorsque la ressource est habituellement un alias vers un autre emplacement.La mémoire est un alias lorsqu'un pointeur sur la mémoire ignore la fonction au moyen d'un paramètre d'annotation _Out_, d'une variable globale, ou d'une valeur de retour.Cet avertissement peut être reporté sur la fonction de sortie si l'argument est annoté comme ayant été prévu d'être libéré.

Notez que PFD ne reconnaît pas l'implémentation réelle d'un allocateur de mémoire (impliquant l'arithmétique de l'adresse) et ne reconnaît pas que la mémoire est allouée (bien que plusieurs wrappers soient identifiés).Dans ce cas, l'analyseur ne reconnaît pas que la mémoire a été allouée et n'émet pas cet avertissement.Pour supprimer le faux positif, utilisez la directive #pragma sur la ligne qui précède l'accolade ouvrante { du corps de la fonction

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 /EHsc /nologo /W4
#include <sal.h>
#include <memory>
 
using namespace std;
 
_Analysis_mode_(_Analysis_local_leak_checks_) 
 
const int ARRAYSIZE = 10;
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};
 
void f( )
{
 
    unique_ptr<int[]> p(new int[ARRAYSIZE]);
    std::copy(begin(TEST_DATA), end(TEST_DATA), p.get());
 
    // code ...
 
    // No need for free/delete; unique_ptr 
    // cleans up when out of scope.
}
 
int main( )
{
    f();
}
 

Voir aussi

Référence

C6211