警告 C6211

由於例外狀況而流失記憶體 『pointer』。 請考慮使用本機 catch 區塊來清除記憶體

備註

這個警告表示擲回例外狀況時,不會釋放已配置的記憶體。 路徑結尾的陳述式可能會擲回例外狀況。

只有在指定 SAL 註釋時 _Analysis_mode_(_Analysis_local_leak_checks_) ,分析器才會檢查此條件。 根據預設,此批注會針對 Windows 核心模式 (驅動程式) 程式代碼指定。 如需 SAL 註釋的詳細資訊,請參閱 使用 SAL 註釋減少 C/C++程式代碼缺失

程式碼分析名稱:MEMORY_LEAK_EXCEPTION

範例

下列程式代碼會產生警告 C6211,因為在第二個配置期間可能會擲回例外狀況,因而洩漏第一個配置。 或者,例外狀況可能會擲回以 「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++標準連結庫 (STL) 所提供的機制。 這些包括 shared_ptrunique_ptr與容器, 例如 vector。 如需詳細資訊,請參閱 智慧型指標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++例外狀況處理