C6280
upozornění C6280: Proměnná <variable> je alokována funkcí <function>, ale je odstraňována funkcí <function>
Toto upozornění signalizuje, že volání funkce nekonzistentně přidělila paměť pomocí funkce z jedné řady přidělení paměti a uvolnila ji pomocí funkce z jiné řady přidělení paměti.Analyzátor kontroluje tuto podmínku pouze tehdy, když je určena anotace SAL _Analysis_mode_(_Analysis_local_leak_checks_).Ve výchozím nastavení je tato poznámka určena pro kód režimu jádra systému Windows (ovladač).Další informace o poznámkách SAL naleznete v tématu Použití poznámek SAL k snížení míry výskytu závad kódu C/C++.
Například toto upozornění by bylo vytvořeno, pokud je paměť přidělena pomocí malloc ale uvolněna pomocí GlobalFree nebo delete.Ve zvláštních případech neshody mezi polem new[] a skalárním delete jsou místo tohoto hlášena přesnější upozornění.
Příklad
Následující ukázka kódu generuje toto upozornění.
// 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;
}
Pro opravu tohoto upozornění použijte tento kód:
// 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);
}
Odlišné definice rozhraní API mohou použít různé haldy.Například GlobalAlloc používá haldu systému a free používá haldu procesu.To pravděpodobně způsobí poškození paměti a selhání.
Tato nekonzistence se týkají mechanismů přidělování paměti new/delete a malloc/free.Chcete-li zabránit těmto potenciálním nekonzistencím zcela, použijte mechanismy, které jsou k dispozici v knihovně C++ STL.Patří mezi ně shared_ptr, unique_ptr a vector.Další informace naleznete v tématu Chytré ukazatele (moderní verze jazyka C++) a Standardní knihovna C++ – referenční dokumentace.
// 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.
}