2010-01-12 21 views
11

Ho una funzione di allocazione personalizzata che utilizza sbrk() per ottenere memoria. Come posso liberare questa memoria quando non è più necessaria?Come si libera la memoria ottenuta da sbrk()?

Esiste una funzione equivalente a free() per malloc()?

oppure devo usare brk() per impostare la fine del segmento dati?

risposta

20

È necessario utilizzare nuovamente brk o sbrk per ridurre.

Alla fine l'unico modo è necessario modificare la quantità di memoria (a parte mmap come syscalls), è quello di aumentare o diminuire il cumulo, quindi si sposta con sbrk o brk e si sposta verso il basso con brk oppure sbrk con un incremento negativo.

+4

-1, è possibile diminuire con 'sbrk', basta passare un valore negativo. – avakar

+0

Hai ragione, lo modifico. Non ho mai usato così, bello. –

+0

Ottimo, ho rimosso il downvote. – avakar

3

Non utilizzare brk e sbrk. È praticamente impossibile sapere quali funzioni della libreria potrebbero chiamare malloc e potrebbero cambiare nel tempo, quindi anche se il tuo programma funziona ora, potrebbe rompersi quando qualcuno aggiorna la libc. Sono stati esclusi da POSIX per un'ottima ragione.

+2

chi ha detto che il suo allocatore non è l'unica cosa usata per allocare dall'heap nel suo processo/applicazione? potrebbe essere perfettamente legittimo. Si prega di astenersi dal solo affermare alcuni "do e dont's" assoluti, come se si conoscesse meglio per tutti in ogni caso. La tua spiegazione è perfetta ma dice anche perché hai torto (caso che non usi malloc). –

+2

@ v.oddou: come fa a sapere che 'printf' non usa' malloc'? (Su molti sistemi reali, lo fa!) O su qualsiasi altra funzione di libreria standard? Questo era il punto centrale della mia risposta. "Non uso' malloc' "non è una condizione sufficiente per' brk' o 'sbrk' per essere sicuro da usare. Davvero * non esiste una condizione sufficiente * per essere sicuri. –

+0

ottimo punto. questo servirà una mediazione per gli utenti di 'sbrk'. Ora, cosa succede se uno non usa affatto stdlib? o meglio, uno stdlib personalizzato che non usa specificamente malloc. O ANCHE, un runtime agganciato che ha hackerato la funzione malloc effettuando un reindirizzamento virtuale della tabella dei simboli in una funzione personalizzata? –

Problemi correlati