Sdílet prostřednictvím


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.
}

Viz také

Referenční dokumentace

calloc

malloc

free

new – operátor (<new>)

delete – operátor (C++)

shared_ptr

unique_ptr

Koncepty

Chytré ukazatele (moderní verze jazyka C++)