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!

¿Fue útil?

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ño sizeof(buf)
  • size tiene un valor de sizeof(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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top