plusieurs appels à realloc () semble provoquer une corruption du tas
-
24-10-2019 - |
Question
Quel est le problème avec ce code? Il plante à chaque fois.
Une fois qu'il est une assertion erronée "_ASSERTE (_CrtIsValidHeapPointer (pUserData));"., D'autres fois il est juste une erreur "corrpuption tas"
Modification de la taille de la mémoire tampon affecte cette question d'une certaine façon étrange -. Parfois, il se bloque sur le « realloc », et d'autres fois sur le « libre »
Je déboguée ce code plusieurs fois, et il n'y a rien d'anormal en ce qui concerne les pointeurs.
char buf[2000];
char *data = (char*)malloc(sizeof(buf));
unsigned int size = sizeof(buf);
for (unsigned int i = 0; i < 5; ++i)
{
char *ptr = data + size;
size += sizeof(buf);
char *tmp = (char*)realloc(data, size);
if (!tmp)
{
std::cout << "Oh no..";
break;
}
data = tmp;
memcpy(ptr, buf, sizeof(buf));
}
free(data);
Merci!
La solution
Vous bousiller le tas. realloc
peut librement choisir de vous retourner la mémoire à partir d'un emplacement tout à fait différent qu'il réaffecte, et ceci est votre ptr
invalidant. Set ptr
après réallocation.
Autres conseils
Sur la deuxième itération de la boucle ici sont les valeurs
- points de
data
à un tampon de taillesizeof(buf)
-
size
a une valeur desizeof(buf)
Compte tenu de ces valeurs la valeur de ptr
est qu'il pointe après la fin de la mémoire tampon allouée à data
. Cette mémoire est pas la propriété du processus et l'opération de memcpy
suivant écrit à cette mémoire et corrompt.
char *ptr = data + size;
char *tmp = (char*)realloc(data, size);
memcpy(ptr, buf, sizeof(buf));
L'appel à realloc()
ici peut potentiellement libérer l'ancien tampon, avant de retourner le nouveau.