次の方法で共有


C6211

警告 C6211: 例外によりメモリ リーク <ポインター> が発生しています。メモリをクリーンアップするには、ローカルの 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_ptrunique_ptrベクターが含まれます。詳細については、「スマート ポインター (Modern 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++ 例外処理