警告 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
スマート ポインター
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示