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