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 delete
vengono 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 delete
non 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 free
deallocazione , 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_ptr
i contenitori , e , unique_ptr
ad 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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per