This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
Re: free() does not call sbrk()
On 15/09/09 06:54 AM, Martin Walter wrote:
Hello!
I am just testing my port of the newlib-1.17.0 for our architecture
and came across the following issue:
(1) the newlib libc documentation says that free() invokes sbrk() with
a negative incrementer argument, but a simple debug trace reveals that
sbrk() is actually never called by free().
(2) when malloc()'ing and free()'ing chunks of memory in a loop it
seems that memory is actually never free()'d, which might be due to
(1). instead, the heap keeps on growing.
I guess this is not the intended behavior. Any ideas? Thank you!
Cheers,
Martin
For starters, you can only give back the end of the last block you took.
You'll notice that malloc_trim does this using MORECORE(-extra).
The documentation does not guarantee "free" will call _sbrk_r with a
negative value. Free gives back storage to the memory storage pool.
Specifically:
When you no longer need an object originally allocated by <<malloc>>
or <<realloc>> (or the related function <<calloc>>), return it to the
memory storage pool by calling <<free>> with the address of the object
as the argument. You can also use <<realloc>> for this purpose by
calling it with <<0>> as the <[nbytes]> argument.
The comment about sbrk is later on:
<<_sbrk_r>> is called with a positive
value to allocate more space, and with a negative value to release
previously allocated space if it is no longer required.
The current malloc design chosen tries to balance speed and maximizing
memory usage (i.e. minimizing fragmentation). It manages the storage
internally. For example, it has a pool of small blocks (bin) that it
reuses over and over again for small requests. This storage is not
given back when you free.
For a discussion on the design see: http://g.oswego.edu/dl/html/malloc.html
which is referenced in libc/stdlib/mallocr.c
My simple test of mallocing a block of 4000 and freeing it back again in
an infinite loop results in the same pointer being given back each time
and no increment in memory usage. I do not know why you are not seeing
similar behavior for your test. Is there something else in your loop
other than malloc/free? (mine has a printf as well)
-- Jeff J.