2010-06-07 16 views
1

Quel est le problème avec ce code? Il se bloque à chaque fois.plusieurs appels à realloc() semble causer une corruption de tas

Une fois c'est une assertion qui a échoué "_ASSERTE (_CrtIsValidHeapPointer (pUserData));", d'autres fois c'est juste une erreur "tas corrpuption".

La modification de la taille de la mémoire tampon affecte ce problème de manière étrange - parfois elle se bloque sur le "realloc", et d'autres fois sur le "libre".

J'ai débogué ce code plusieurs fois, et il n'y a rien d'anormal concernant 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!

+1

(Désolé pour l'édition Phantom) La vraie question est: Pourquoi utilisez-vous realloc en C++? C'est à ça que sert 'std :: vector'. –

+1

En réalité, j'écris une classe .. la mémoire est libérée dans le destrucor, donc aucun mal n'est jamais possible. std :: vector est juste trop lourd pour ce but précis. – Windindeed

+1

qu'est-ce que vous voyez exactement comme "lourd" à propos de 'vector'? En réalité, avec le moindre soin, il sera presque toujours * plus rapide * que cela (probablement avec un code plus petit). –

Répondre

1

Vous écrasez le tas. realloc peut librement choisir de vous renvoyer la mémoire à partir d'un emplacement entièrement différent lors de la réaffectation, ce qui invalide votre ptr. Définissez ptr après réattribution.

+0

Oui .. Après avoir écrit le poste exactement qui a attiré mon attention ..Je suppose que tout ce qui est nécessaire pour obtenir une réponse est d'écrire un post .. surtout si vous déboguez votre application pendant près de 4 heures pour trouver un problème. : D Merci! – Windindeed

0

Sur la deuxième itération de la boucle ici sont les valeurs

  • data des points à 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 la fin de la mémoire tampon allouée en data. Il s'agit d'une mémoire qui n'appartient pas au processus et l'opération memcpy suivante y écrit et corrompt la mémoire.

0
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.