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_ptr、 unique_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.
}