Sdílet prostřednictvím


C6211

upozornění C6211: Nevracení paměti <pointer> z důvodu výjimky.Zvažte použití místního bloku catch pro vyčištění paměti

Toto upozornění znamená, že, přidělená paměť není při vyvolání výjimky uvolňována.Prohlášení na konci cesty může vyvolat výjimku.Analyzátor hledá tento stav jen tehdy, když _Analysis_mode_(_Analysis_local_leak_checks_) zadané poznámky SAL.Ve výchozím nastavení tato poznámka je určena pro kód (ovladač) režimu jádra systému Windows.Další informace o poznámky SAL, viz Pomocí poznámek SAL snížit vady kód C/C++.

Příklad

Následující kód generuje toto varování, protože by mohla vyvolána výjimka během druhé přidělení a tím nevracení první přidělení nebo může být vyvolána výjimka někde v kódu, který je reprezentován "code ..." přidat komentář a tím způsobit únik obou přidělení.

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

Chcete-li používají stejné metody přidělení a tento problém vyřešit, přidejte obslužnou rutinu výjimky:

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

Tyto druhy potenciální nevracení zcela vyhnout, použijte mechanismy, které jsou k dispozici v C++ šablonu knihovny STL (Standard).Patří mezi ně shared_ptr, unique_ptr, a vektorové.Další informace naleznete v tématu Inteligentní ukazatelů (Příručka programování moderních C++) a Referenční Standardní knihovna 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.
}

Viz také

Referenční dokumentace

Zpracování výjimek v C++