múltiples llamadas a reasloc () parece causar una corrupción de montón
-
24-10-2019 - |
Pregunta
¿Cuál es el problema con este código? Se bloquea cada vez.
Una vez es una afirmación fallida "_Asserte (_crtisValidHeAppointer (puserData));", otras veces es solo un error de "corregción de montón".
Cambiar el tamaño del búfer afecta este problema de alguna manera extraña: a veces se bloquea en el "reasloc" y otras veces en el "libre".
He depurado este código muchas veces, y no hay nada anormal con respecto a los punteros.
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);
¡Gracias!
Solución
Estás destrozando el montón. realloc
puede optar libremente devolver su memoria de una ubicación completamente diferente a medida que se reinicia, y esto está invalidando su ptr
. Establecer ptr
Después de reasignar.
Otros consejos
En la segunda iteración del bucle aquí están los valores
data
apunta a un búfer de tamañosizeof(buf)
size
tiene un valor desizeof(buf)
Dados estos valores el valor de ptr
es que apunta más allá del final del búfer asignado a data
. Esta es la memoria que no es propiedad del proceso y el siguiente memcpy
Operation escribe a esto y corrompe la memoria.
char *ptr = data + size;
char *tmp = (char*)realloc(data, size);
memcpy(ptr, buf, sizeof(buf));
La llamada a realloc()
Aquí puede liberar potencialmente el antiguo búfer, antes de devolver el nuevo.