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!

Était-ce utile?

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 taille sizeof(buf)
  • size a une valeur de sizeof(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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top