C6280
upozornění C6280: Proměnná <variable> je alokována funkcí <function>, ale je odstraňována funkcí <function>
Toto upozornění znamená, že volání funkce má nekonzistentně přidělené paměti pomocí funkce z řady přidělení jednoho paměti a uvolnit pomocí funkce z jiné řady přidělení paměti.Analyzátor hledá tento stav jen tehdy, když _Analysis_mode_(_Analysis_local_leak_checks_) zadané poznámky SAL.Ve výchozím nastavení tato poznámka je určena pro kód (ovladač) režimu jádra systému Windows.Další informace o poznámky SAL, viz Pomocí poznámek SAL snížit vady kód C/C++.
Například toto upozornění dostanete-li vyhradit paměť pomocí malloc ale uvolněné pomocí GlobalFree nebo delete.Ve zvláštních případech neshody mezi pole new[] a skalární delete, přesnější varování, které jsou hlášeny místo tohoto.
Příklad
Následující ukázkový kód 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;
}
Chcete-li opravit toto 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);
}
Různé definice rozhraní API lze použít různé haldy.Například GlobalAlloc používá haldu systému a free používá haldu procesu.To může způsobit poškození paměti a dojde k chybě.
Použít tyto nekonzistence new/delete a malloc/free mechanismy přidělování paměti.Tyto druhy potenciální nekonzistence zcela zabránit, používejte mechanismy, které jsou k dispozici v C++ šablonu knihovny STL (Standard).Patří mezi ně shared_ptr, unique_ptr, a vektorové.Další informace naleznete v tématu Inteligentní ukazatelů (Příručka programování moderních C++) a Referenční Standardní knihovna 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.
}
Viz také
Referenční dokumentace
Koncepty
Inteligentní ukazatelů (Příručka programování moderních C++)