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í 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

calloc

MALLOC

free

operator new (<new>)

Odstraňte operátor (C++)

shared_ptr

unique_ptr

Koncepty

Inteligentní ukazatelů (Příručka programování moderních C++)