Condividi tramite


Avviso C6280

'variable-name' viene allocato con 'function-name-1', ma eliminato con 'function-name-2'

Questo avviso indica che la funzione chiamante ha allocato in modo incoerente la memoria usando una funzione di una famiglia e liberandola usando una funzione da un'altra.

Osservazioni:

L'analizzatore verifica questa condizione solo quando viene specificata l'annotazione _Analysis_mode_(_Analysis_local_leak_checks_) SAL. Per impostazione predefinita, questa annotazione viene specificata per il codice della modalità kernel di Windows (driver). Per altre informazioni sulle annotazioni SAL, vedere Uso delle annotazioni SAL per ridurre i difetti del codice C/C++.

Ad esempio, questo avviso viene generato se la memoria viene allocata usando malloc ma liberata tramite GlobalFree o delete. Nei casi specifici di mancata corrispondenza tra matrice new[] e scalare deletevengono segnalati avvisi più precisi anziché questo.

Nome dell'analisi del codice: MEMORY_ALLOCATION_MISMATCH

Esempio

Il codice di esempio seguente genera questo avviso. pInt viene allocato usando calloc ma viene liberato usando la funzione deletenon corrispondente :

// C6280a_warning.cpp
// 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;
}

Il codice seguente evita questo avviso usando la funzione freedeallocazione , la corrispondenza con calloc:

// C6280a_no_warning.cpp
// 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);
}

Diverse definizioni di API possono usare heap diversi. Ad esempio, GlobalAlloc usa l'heap di sistema e free usa l'heap del processo. Questo problema potrebbe causare danneggiamenti della memoria e arresti anomali.

Queste incoerenze si applicano ai meccanismi di allocazione della new/delete memoria e .malloc/free Per evitare completamente questi tipi di potenziali incoerenze, usare i meccanismi forniti dalla libreria standard C++ (STL). Sono inclusi shared_ptri contenitori , e , unique_ptrad esempio vector. Per altre informazioni, vedere Puntatori intelligenti e libreria standard C++.

Il codice seguente evita completamente questo problema usando unique_ptr:

// C6280b_no_warning.cpp
// 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.
}

Vedi anche

calloc
malloc
free
operator new
Operatore delete
shared_ptr
unique_ptr
Puntatori intelligenti