C6211
警告 C6211: 例外によりメモリ リーク <pointer> が発生しています。 メモリをクリーンアップするには、ローカルの catch ブロックを使用してください
この警告は、例外がスローされたときに、割り当てられたメモリが解放されていないことを示しています。 パスの末尾にあるステートメントで、例外がスローされる可能性があります。 アナライザーは、_Analysis_mode_(_Analysis_local_leak_checks_) SAL 注釈が指定されている場合にのみこの条件をチェックします。 既定では、この注釈は Windows カーネル モード (ドライバー) コードに対して指定されます。 SAL 注釈の詳細については、「SAL 注釈を使って C/C++ のコード障害を減らす方法」を参照してください。
例
次のコードでは、2 番目の割り当て中に例外がスローされ、最初の割り当てをリークする可能性があるため、この警告が生成されます。また、"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_ptr、unique_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.
}