2010-01-12 32 views
11

Tengo una función de asignación personalizada que usa sbrk() para obtener memoria. ¿Cómo puedo liberar esta memoria cuando ya no es necesaria?¿Cómo puedo liberar memoria obtenida por sbrk()?

¿Existe una función equivalente a free() para malloc()?

o tengo que usar brk() para establecer el final del segmento de datos?

Respuesta

20

Debe volver a utilizar brk o sbrk para reducir el tamaño.

Al final, la única manera que tiene que modificar la cantidad de memoria (aparte de mmap como llamadas al sistema), es para aumentar o disminuir el montón, por lo que lo mueve con sbrk o brk y lo mueve hacia abajo con brk o sbrk con un incremento negativo.

+4

-1, puedes disminuir con 'sbrk', solo pasale un valor negativo. – avakar

+0

Tienes razón, lo editaré. Nunca usé sbrk así, genial. –

+0

Genial, he eliminado el voto en negativo. – avakar

3

No utilice brk y sbrk. Es casi imposible saber qué funciones de la biblioteca pueden llamar al malloc, y podrían cambiar con el tiempo, por lo que incluso si su programa funciona ahora, podría romperse cuando alguien actualice la libc. Fueron excluidos de POSIX por una muy buena razón.

+2

¿quién dijo que su asignador no es lo único que se utiliza para asignar desde el montón en su proceso/aplicación? podría ser perfectamente legítimo. Por favor, absténgase de solo decir "hacer y no hacer" absoluto, como si supiera mejor para todos en todos los casos. Tu explicación es perfecta, pero también dice por qué estás equivocado (caso de que no use malloc). –

+2

@ v.oddou: ¿Cómo sabe que 'printf' no usa' malloc'? (¡En muchos sistemas reales, sí!) ¿O cualquier otra función de biblioteca estándar? Ese fue todo el punto de mi respuesta. "No uso' malloc' "no es una condición suficiente para que' brk' o 'sbrk' sean seguros de usar. Realmente * no hay condiciones suficientes * para que estén a salvo. –

+0

muy buen punto. que servirá de mediación para los usuarios de 'sbrk'. Ahora, ¿qué pasa si uno no usa ningún stdlib en absoluto? o mejor, un stdlib personalizado que específicamente no usa malloc. O INCLUSO, ¿un tiempo de ejecución enganchado que piratea la función malloc haciendo una redirección virtual de tablas de símbolos en una función personalizada? –

Cuestiones relacionadas