[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: STL, memory allocation, and cleanup (gcc 3.0?)



On Monday 19 November 2001 03:27, elf@florence.buici.com wrote:
> I've written a C++ program to demonstrate behavior that I cannot
> explain.  It appears that the STL allocates memory that it never
> frees.  I'd like to believe that I'm missing something obvious, but
> then it must not be obvious enough.  Yes, I've run the debugger on it.
> It looks to be a GCC bug, but I cannot be sure since I don't have an
> explanation for the fact that a large block is allocated for the first
> Map and not for the second, *and* there are no static members in the
> Map template.
>
It is probably not a bug:
the full template for most (all?) STL-containers is 
template<class Element, class Allocator=std::allocator<Element> >

This allocator is a wrapper around the memory-management. I think there is a 
simple example for this in Stroustrup's Bible, as far as I remember, it went 
like this:
- the allocator has only static functions
- the allocator is asked for a pointer to n contiguous elements. If it has 
some memory of proper size in its internal cache, it hands these to the 
container, else it calls eg malloc to get more.
- when it is not needed anymore, the memory is given back to the allocator 
which adds the mem to its internal queue
- when an operator new fails, the new_handler-function is called, first 
requesting the allocators to free their surplus memory, if that is not 
enough, the finalizing bad_allow is thrown.

I also remember seeing an alternate implementation on www.codeguru.com, if 
you're interested.


> The program hooks new/delete and malloc/free, printing messages when
> one is called.  This all arose because I am using nearly identical
> code in another application to prove that it is memory conservative.
With your hooks, you're entering shallow waters here: there is no guarantee 
that all code is templatized, there can well be some part in a shared lib 
that then uses malloc without you seeing it.

[snipped code]
after adding a std:: here and there, this is the result with g++-3.0:
uli@doommachine:uli$ ./a.out 
map_p
malloc 12 -> 0x804c530
free 0x804c530
map_p
malloc 12 -> 0x804c530
free 0x804c530
uli@doommachine:uli$ 




Reply to: