次の方法で共有


警告 C6280

'variable-name' は 'function-name-1' で割り当てられますが、'function-name-2' で削除されます

この警告は、呼び出し元の関数が、あるファミリの関数を使用してメモリを一貫性なく割り当て、別のファミリの関数を使用して解放したことを示します。

解説

アナライザーは、_Analysis_mode_(_Analysis_local_leak_checks_) SAL 注釈が指定されている場合にのみこの条件をチェックします。 既定では、この注釈は Windows カーネル モード (ドライバー) コードに対して指定されます。 SAL 注釈の詳細については、「SAL 注釈を使って C/C++ のコード障害を減らす方法」をご覧ください。

たとえば、この警告はメモリが malloc を使用して割り当てられ、GlobalFree または delete を使用して解放された場合に生成されます。 配列 new[] とスカラー delete の違いのような特定の不一致の状況では、この警告の代わりにさらに正確な警告が報告されます。

コード分析名: MEMORY_ALLOCATION_MISMATCH

この警告が生成されるコード例を次に示します。 pInt は使用して calloc 割り当てられますが、不一致の関数 deleteを使用して解放されます。

// C6280a_warning.cpp
// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>

_Analysis_mode_(_Analysis_local_leak_checks_)

void f(int arraySize)
{
    int *pInt = (int *)calloc(arraySize, sizeof (int));
    // code ...
    delete pInt;
}

次のコードでは、割り当て解除関数 (次に一致する関数 free) を使用して、この警告を calloc回避します。

// C6280a_no_warning.cpp
// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>

_Analysis_mode_(_Analysis_local_leak_checks_)

void f(int arraySize)
{
    int *pInt = (int *)calloc(arraySize, sizeof (int));
    // code ...
    free(pInt);
}

異なる API 定義が別個のヒープを使用することが可能です。 たとえば、GlobalAlloc がシステム ヒープを使用し、free がプロセス ヒープを使用します。 この問題は、メモリの破損とクラッシュを引き起こす可能性があります。

これらの不整合が new/delete および malloc/free のメモリ割り当て機構に適用されます。 このような潜在的な不整合を完全に回避するには、C++ 標準ライブラリ (STL) によって提供されるメカニズムを使用します。 これらには、次unique_ptrのようなvectorコンテナーが含まれますshared_ptr。 詳細については、「スマート ポインター」および「C++ 標準ライブラリ」を参照してください。

次のコードでは、この問題を完全に回避します。unique_ptr

// C6280b_no_warning.cpp
// 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(int arraySize)
{
    // use unique_ptr instead of calloc/malloc/new
    unique_ptr<int[]> pInt(new int[arraySize]);

    // code ...

    // No need for free because unique_ptr
    // cleans up when out of scope.
}

関連項目

calloc
malloc
free
operator new
delete 演算子
shared_ptr
unique_ptr
スマート ポインター