C6280
警告 C6280: <variable> 是以 <function> 配置,但以 <function> 刪除
這則警告表示呼叫函式是配置記憶體使用函式從一個記憶體配置系列和釋放它使用函式從另一個記憶體配置系列。 只有當 _Analysis_mode_(_Analysis_local_leak_checks_) SAL 附註指定時,分析器會檢查這個條件。 根據預設,這個附註為視窗 (核心模式驅動程式) 程式碼指定。 如需 SAL 註釋的詳細資訊,請參閱 使用 SAL 註釋減少 C/C++ 程式碼的缺失。
例如,您可以使用 GlobalFree 或 delete,,,如果記憶體配置使用 malloc ,但會釋放這個警告會產生。 在特定情況下陣列 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 定義可以使用不同的堆積 (Heap)。 例如, GlobalAlloc 會使用系統堆疊和 free 用來管理堆積。 這可能會導致記憶體損毀和當機。
這些不一致適用於 new/delete 和 malloc/free 記憶體配置機制。 若要完全避免這類潛在不一致,請使用 C++ Standard Template Library (STL) 提供的機制。 其中包括 shared_ptr、 unique_ptr和 向量。 如需詳細資訊,請參閱智慧型指標 (現代的 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.
}