C6280
警告 C6280: <変数> は <関数> で割り当てられていますが、<関数> で削除されています。
この警告は、割り当て関数を使用して別のメモリ割り当てファミリことをから呼び出し元の関数が 1 台のメモリ割り当てファミリからの関数を使用して競合メモリを解放したことを示します。アナライザーはこの要件を持つように _Analysis_mode_(_Analysis_local_leak_checks_) SAL のコメントを指定した場合にのみ認識します。既定では、このコメントは Windows のカーネル モード (ドライバー) コードに対して指定します。SAL コメントに関する詳細については、SAL 注釈を使って C/C++ のコード障害を減らす方法を参照してください。
たとえば、この警告は割り当てられますが、GlobalFree か deleteを使用してメモリが malloc を使用して、解放された場合ですされます。配列 new[] とスカラー delete間に不一致の特定のボックスに、より具体的には、この 1 の警告が報告されます。
使用例
次のサンプル コードでは、この警告が生成されます。
// 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;
}
この警告を解決するには、このコードを使用する:
// 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) によって提供される機構を使用します。これらは shared_ptr、unique_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(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.
}