共用方式為


C6211

警告 C6211: 因例外狀況而造成遺漏的記憶體 <pointer>。 請考慮使用區域 catch 區塊清除記憶體

這項警告表示在擲回例外狀況時,並未釋放已配置的記憶體。 陳述式在陳述式可以擲回例外狀況。 只有當 _Analysis_mode_(_Analysis_local_leak_checks_) SAL 附註指定時,分析器會檢查這個條件。 根據預設,這個附註為視窗 (核心模式驅動程式) 程式碼指定。 如需 SAL 註釋的詳細資訊,請參閱 使用 SAL 註釋減少 C/C++ 程式碼的缺失

範例

下列程式碼會產生這項警告,因為例外狀況可能在第二個配置時擲回因而的初次設定,或者例外狀況在「code ...」註解所表示的程式碼可能會擲回某處因而遺漏兩個配置。

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

若要使用相同的配置和嘗試修正這個問題,請加入例外處理常式:

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

若要完全避免這類潛在遺漏,請使用 C++ Standard Template Library (STL) 提供的機制。 其中包括 shared_ptrunique_ptr向量。 如需詳細資訊,請參閱智慧型指標 (現代的 C++)標準 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.
}

請參閱

參考

C + + 例外處理