Pregunta

int main ()
{
    int * b;
    b = (int*) malloc (1);
    *b=110000;
    free (b);
    return 0;
}

¿Por qué sucede daños en el montón en free (b);?

OMI, daños en la pila ya sucede en *b=110000;.

¿Fue útil?

Solución

El argumento de malloc() es el número de bytes a reservar. Es necesario utilizar:

b = (int*) malloc(sizeof(int));

Se ha asignado un bloque demasiado pequeño, y luego por escrito más bytes a él que le ha asignado, que sobrescribe la información contabilidad al lado del bloque, corrompiendo el montón.

Otros consejos

Es en * b = 110,000; Debido a que se están asignando la memoria de un byte, y luego asignar un int en él, que es más de un byte. Cualquiera puede tener b = (int *) malloc (sizeof (int)) o en lugar de int * b se puede tener char * b y luego emitir el puntero malloced a char *. El código se puede incluso trabajar si asigna un valor que es inferior a 128 (debido a signed char) a * b.

EDIT: - creo que incluso a veces esto va a funcionar sin ningún tipo de molestia. Debido a que el compilador puede optar por asignar más de un byte de memoria para un acceso rápido de los datos.

El daños en el montón de hecho ya sucede en la asignación *b=11000, pero no se detecta hasta que la llamada free(b) ya que es el primer punto donde la integridad de la pila se comprueba de nuevo.

Verificación de la integridad del montón en cada asignación (o incluso cada tarea que implique un puntero sin referencia) frenaría la mayoría de los programas demasiado abajo y sería atar el compilador con demasiada fuerza a la implementación de la biblioteca. Por esa razón, las comprobaciones de integridad única se realizan cuando el montón se manipula, que está en las funciones malloc y free (y amigos).

El código escribe más datos para el bloque de memoria que el espacio de que dispone, por tanto, corrompiendo el comienzo del siguiente bloque de memoria válida.

Uso char * en vez de int * y escribir un valor de -128 a 127 a * b debe solucionarlo.

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