C6280
警告 C6280: <変数> は <関数> で割り当てられていますが、<関数> で削除されています
この警告は、あるメモリ割り当てファミリからの関数を使用して割り当てたメモリを別のメモリ割り当てファミリからの関数を使用して解放したため、呼び出し関数の一貫性が損なわれていることを示します。アナライザーは、_Analysis_mode_(_Analysis_local_leak_checks_) SAL 注釈が指定されている場合にのみこの条件をチェックします。既定では、この注釈は Windows カーネル モード (ドライバー) コードに対して指定されます。SAL 注釈の詳細については、「SAL 注釈を使って C/C++ のコード障害を減らす方法」を参照してください。
たとえば、この警告はメモリが malloc を使用して割り当てられ、GlobalFree または delete を使用して解放された場合に生成されます。配列 new[] とスカラー delete の違いのような特定の不一致の状況では、この警告の代わりにさらに正確な警告が報告されます。
使用例
この警告が生成されるコード例を次に示します。
// 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、vector などがあります。詳細については、「スマート ポインター (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.
}