C6280

avviso C6280: <variabile> è stato allocato con <funzione>, ma eliminato con <funzione>

L'avviso indica che nella funzione chiamante in maniera incoerente memoria allocata tramite una funzione di una famiglia di allocazione della memoria e liberata con una funzione di un'altra famiglia.I controlli dell'analizzatore per questo una probabile condizione solo quando le annotazioni SAL di _Analysis_mode_(_Analysis_local_leak_checks_) è specificata.Per impostazione predefinita, questa voce viene specificata per il codice in modalità kernel di Windows (driver).Per ulteriori informazioni sulle annotazioni SAL, vedere Utilizzo delle annotazioni SAL per ridurre gli errori del codice C/C++.

Ad esempio, l'avviso viene generato se la memoria allocata tramite malloc ma liberata con GlobalFree o delete.Nei casi specifici di mancata corrispondenza tra matrice new[] e deletescalare, verranno riportati avvisi più precisi di questo.

Esempio

Il seguente codice di esempio genera l'avviso.

// 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;
}

Per risolvere il problema, utilizzare il codice seguente:

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

Per definizioni di API diverse è possibile utilizzare heap diversi.Ad esempio, GlobalAlloc utilizza l'heap di sistema e l'utilizzo di free l'heap del processo.Ciò potrebbe causare danneggiamenti della memoria e arresti anomali del sistema.

Le incoerenze si applicano a new/delete e malloc/meccanismi allocazione di memoria difree.Per evitare questi tipi di incoerenze potenziali complessivamente, utilizzare i meccanismi forniti dalla libreria standard (STL) del modello di C++.Questi includono shared_ptr, unique_ptre vettore.Per ulteriori informazioni, vedere Puntatori intelligenti (C++ moderno) e Riferimento della libreria C++ standard.

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

Vedere anche

Riferimenti

calloc

malloc

free

operator new (<new>)

operatore delete (C++)

shared_ptr

unique_ptr

Concetti

Puntatori intelligenti (C++ moderno)