Avertissement C6211

Fuite de mémoire « pointeur » en raison d’une exception. Envisagez d’utiliser un bloc catch local pour propre mémoire up

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 du chemin d’accès peut lever une exception.

Notes

L’analyseur case activée pour cette condition uniquement lorsque l’annotation _Analysis_mode_(_Analysis_local_leak_checks_) SAL 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, consultez Utilisation des annotations SAL pour réduire les défauts de code C/C++.

Nom de l’analyse du code : MEMORY_LEAK_EXCEPTION

Exemple

Le code suivant génère l’avertissement C6211, car une exception peut être levée pendant la deuxième allocation et fuite ainsi la première allocation. Ou une exception peut être levée quelque part dans le code représenté par le commentaire «code ... » et 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 fonctions d’allocation et corriger 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, utilisez les mécanismes fournis par la bibliothèque C++ Standard (STL). Ceux-ci incluent shared_ptr, unique_ptret des conteneurs tels que vector. Pour plus d’informations, consultez Les pointeurs intelligents et la 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( )
{
    // 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

Gestion des exceptions C++