C6211
avertissement C6211 : Mémoire <pointer> 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 contenue à la fin du chemin d'accès peut lever une exception.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 car une exception peut être déclenchée pendant la deuxième allocation et déstabiliser ainsi la première allocation, ou une exception peut être générée quelque part dans le code représenté par le commentaire «code ...» et déstabiliser 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 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( )
{
// 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.
}