Partager via


C6211

avertissement C6211 : mémoire <pointeur> manquante liée à une exception.Si possible, utilisez un bloc catch local pour nettoyer la mémoire

Cet avertissement indique que la mémoire allouée n'est pas libérée lorsqu'une exception est levée.L'instruction à la fin de le chemin d'accès peut lever une exception.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++.

Exemple

Le code suivant génère cet avertissement car une exception peut être levée pendant la deuxième allocation et la fuite ainsi la première allocation, une exception peut être levée à un endroit dans le code représenté par le commentaire « code ... » et la fuite ainsi les deux allocations.

// cl.exe /analyze /c /EHsc /nologo /W4 
#include <sal.h>
 
_Analysis_mode_(_Analysis_local_leak_checks_) 
void f( )
{
    char *p1 = new char[10];
    char *p2 = new char[10];
 
    // code ...
 
    delete[] p2;
    delete[] p1;
}

Pour utiliser les mêmes méthodes d'allocation et résoudre ce problème, ajoutez un gestionnaire d'exceptions :

// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <new>
#include <iostream>
using namespace std;
 
_Analysis_mode_(_Analysis_local_leak_checks_) 
 
void f()
{
    char *p1 = nullptr; 
    char *p2 = nullptr;
 
    try
    {
        p1 = new char[10];
        p2 = new char[10];
 
        // code ...
 
        delete [] p2;
        delete [] p1;
    }
    catch (const bad_alloc& ba)
    {
        cout << ba.what() << endl;
        delete [] p2;
        delete [] p1;
    }
    // code ...
}

Pour éviter ces types de fuites 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( )
{
    // use 10-element vectors in place of char[10]
    vector<char> v1;
    vector<char> v2;
 
    for (int i=0; i<10; ++i) {
        v1.push_back('a');
        v2.push_back('b');
    }
    // code ...
 
    // use unique_ptr if you still want char[10]
    unique_ptr<char[]> a1(new char[10]);
    unique_ptr<char[]> a2(new char[10]);
    
    // code ...
 
    // No need for delete; vector and unique_ptr 
    // clean up when out of scope.
}

Voir aussi

Référence

Gestion des exceptions C++