Condividi tramite


Avviso C6308

'realloc' può restituire un puntatore Null: l'assegnazione di un puntatore Null a 'parameter-name', che viene passato come argomento a 'realloc', causerà la perdita del blocco di memoria originale

Osservazioni:

Le funzioni di riallocazione heap non liberano il buffer passato se la riallocazione non riesce, causando potenzialmente una perdita di memoria se non viene gestita correttamente. Per correggere il problema, assegnare il risultato della funzione di riallocazione a una variabile temporanea e quindi sostituire il puntatore originale dopo la corretta riallocazione.

Nome dell'analisi del codice: REALLOCLEAK

Esempio

Il codice di esempio seguente genera l'avviso C6308. Questo problema deriva dall'assegnazione del valore restituito da realloc a x. Se realloc ha esito negativo e restituisce un puntatore Null, la memoria originale a x cui punta non verrà liberata:

#include <malloc.h>
#include <windows.h>

void f( )
{
    char *x = (char *) malloc(10);
    if (x != NULL)
    {
        x = (char *) realloc(x, 512);
        // code...
        free(x);
    }
}

Per risolvere il problema, è possibile creare una variabile temporanea per archiviare il valore restituito di realloc. Questa modifica consente di liberare la memoria allocata in precedenza in modo sicuro in caso realloc di errore:

#include <malloc.h>
#include <windows.h>

void f()
{
    char *x = (char *) malloc(10);
    if (x != NULL)
    {
        char *tmp = (char *) realloc(x,512);
        if (tmp != NULL)
        {
            x = tmp;
        }
        // code...
        free(x);
    }
}

Questo avviso potrebbe generare rumore se è presente un alias attivo per il buffer da riallocare al momento dell'assegnazione del risultato della funzione di riallocazione.

Per evitare completamente questi tipi di problemi, 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++.

Vedi anche

Avviso C6014