Partager via


Avertissement C6308

'realloc' peut retourner un pointeur Null : l’affectation d’un pointeur Null à 'parameter-name', qui est passé en tant qu’argument à 'realloc', entraîne la fuite du bloc de mémoire d’origine

Notes

Les fonctions de réaffectation de tas ne libèrent pas la mémoire tampon passée si la réaffectation échoue, ce qui peut entraîner une fuite de mémoire si elle n’est pas gérée correctement. Pour corriger le problème, affectez le résultat de la fonction de réaffectation à une variable temporaire, puis remplacez le pointeur d’origine après la réaffectation réussie.

Nom de l’analyse du code : REALLOCLEAK

Exemple

L’exemple de code suivant génère l’avertissement C6308. Ce problème provient de l’affectation de la valeur de retour à reallocx. En realloc cas d’échec et de retour d’un pointeur Null, la mémoire d’origine pointée par x ne sera pas libérée :

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

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

Pour résoudre le problème, vous pouvez créer une variable temporaire pour stocker la valeur de retour de realloc. Cette modification vous permet de libérer la mémoire allouée précédemment en toute sécurité en cas realloc d’échec :

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

Cet avertissement peut générer du bruit s’il existe un alias en direct vers la mémoire tampon à réallouer au moment de l’affectation du résultat de la fonction de réaffectation.

Pour éviter tous ces types de problèmes, utilisez les mécanismes fournis par la bibliothèque standard C++ (STL). Ceux-ci incluent shared_ptr, unique_ptret des conteneurs tels que vector. Pour plus d’informations, consultez Les pointeurs intelligents et la bibliothèque standard C++.

Voir aussi

Avertissement C6014