2010-02-25 14 views
8

Esta pregunta me fue formulada en una entrevista.¿Qué sucede cuando intenta liberar memoria asignada por el administrador de montón, que asigna más de lo que se solicita?

Supongamos que char * p = malloc (n) asigna más que n, digamos que se asignan N bytes de memoria y free (p) se usa para liberar la memoria asignada a p.

¿Puede Heap Manager realizar dicha asignación defectuosa? ¿Qué ocurre ahora? ¿Se liberarán n bytes o se liberarán N bytes?

¿Hay algún método para encontrar cuánta memoria se libera?

EDITAR

¿hay algún método para encontrar la cantidad de memoria se libera?

mejor que nada,

mallinfo() puede arrojar algo de luz como se ha señalado por "Fred Larson"

+6

¿Por qué crees que tal asignación es incorrecta? Independientemente de cuántos bytes "reales" 'malloc()' asignados, solo puede usar 'n' bytes, y' free() 'liberará todos los bytes asignados. La mayoría de las implementaciones 'malloc' asignan más espacio que el solicitado por razones de eficiencia. Una implementación define 'malloc' y' free', y por definición, tienen que acordar un esquema de asignación. –

Respuesta

8

Sí, eso es lo que ocurre casi siempre, malloc(). El encabezado del bloque malloc contiene información sobre el tamaño del bloque y cuando se llama al free(), devuelve esa cantidad al montón. No es defectuoso, es una operación esperada.

Una implementación simple podría, por ejemplo, almacenar solo el tamaño del bloque en el espacio inmediatamente anterior al puntero devuelto. Entonces, free() sería algo como esto:

void free(void *ptr) 
{ 
    size_t *size = (size_t *)ptr - 1; 

    return_to_heap(ptr, *size); 
} 

Dónde return_to_heap() se utiliza aquí para referirse a una función que hace el trabajo real de la devolución del bloque especificado de la memoria a la pila para su uso futuro.

+0

¿Hay algún método para averiguar cuánta memoria se libera? – Rozuur

+0

@rozuur: Toda la memoria asignada por 'malloc()' se liberará por 'free()'. Creo que su verdadera pregunta es cómo averiguar cuánta memoria se asignó. (¿Y la respuesta? Al menos tanto como se solicitó, si la asignación fue exitosa) – Bill

+1

rozuur: mira esta página: http://msdn.microsoft.com/en-us/library/ms220938(VS.80) .aspx da una idea de lo que realmente se hace cuando se solicita un trozo de memoria. La mayoría de las implementaciones son muy similares a esto. – ThePosey

4

Sí, se permite que el administrador del montón para devolver un bloque de más de n bytes. Es completamente seguro (¡y obligatorio!) Liberar el puntero devuelto usando free, y free lo desasignará todo.

Muchas implementaciones de montón siguen sus asignaciones insertando bloques de metadatos en el montón. free buscará esos metadatos para determinar cuánta memoria desasignar. Sin embargo, esto es específico de la implementación, por lo que no hay forma de saber cuánto le dio malloc y, en general, no debería importarle.

1

En general, el administrador de montón liberará lo asignado. Almacena esta información en algún lugar, y la busca cuando se llama al free().

Un heap manager no es "defectuoso" si asigna más memoria que la solicitada. Los gerentes de montón a menudo trabajan con tamaños de bloques fijos, y redondearán hasta el siguiente tamaño de bloque cuando satisfagan una solicitud. El trabajo del heap manager es ser lo más eficiente posible y, a menudo, grandes eficiencias resultan de algunas pequeñas ineficiencias.

+0

"a menudo grandes eficiencias resultan de algunas pequeñas ineficiencias" Buena cita 8 ^) – caseman

1

Este es el comportamiento predeterminado de malloc. Devolverá NULL o un puntero a una sección de memoria al menos tan larga como la que solicitó. Entonces sí, debe ser capaz de manejar la eliminación de la memoria por más tiempo del que se le pidió.

Averiguar cuánta memoria era realmente gratuita o asignada es una pregunta específica de la plataforma.

1

Otras respuestas han explicado bien cómo se maneja el tamaño del bloque. Para saber cuánta memoria se libera, la única solución que se me ocurre es llamar al mallinfo() antes y después de la liberación.

Cuestiones relacionadas