Re: STL, memory allocation, and cleanup (gcc 3.0?)
On Mon, Nov 19, 2001 at 03:59:29PM +1100, Brian May wrote:
> >>>>> "elf" == elf <elf@florence.buici.com> writes:
>
> elf> I've written a C++ program to demonstrate behavior that I
> elf> cannot explain. It appears that the STL allocates memory
> elf> that it never frees. I'd like to believe that I'm missing
> elf> something obvious, but then it must not be obvious enough.
> elf> Yes, I've run the debugger on it. It looks to be a GCC bug,
> elf> but I cannot be sure since I don't have an explanation for
> elf> the fact that a large block is allocated for the first Map
> elf> and not for the second, *and* there are no static members in
> elf> the Map template.
>
> elf> The program hooks new/delete and malloc/free, printing
> elf> messages when one is called. This all arose because I am
> elf> using nearly identical code in another application to prove
> elf> that it is memory conservative.
>
> I get:
>
> map_p
> malloc 12 -> 0x8053808
> malloc 960 -> 0x8053818
> free 0x8053808
> map_p
> malloc 12 -> 0x8053808
> free 0x8053808
Yep. That's it.
> This looks like (to me anyway) that 960 bytes memory is getting
> allocated by STL, and it is allocated static so that it gets shared by
> subsequent calls by whatever uses it.
I haven't been able to find where this could be happening. I've read
through the template code without finding anything that could explain
this.
> elf> Questions include:
>
> elf> 1) Is there a gcc 3.0 machine I can use to run this test?
>
> I got compile errors. Sorry, I don't know what is wrong either :-)
Hmm. I'm not sure why you'd be getting syntax errors. Did you start
your source file with the comment? It looks like it doesn't link my
typedefs.
How about returning me a preprocessed version?
gcc -E -c -o freetest.i freetest.cc
> [521] [scrooge:bam] ~ >gcc-3.0 -o freetest freetest.cc
> freetest.cc:24: syntax error before `;' token
> freetest.cc:25: syntax error before `;' token
> freetest.cc:30: 'Map' is used as a type, but is not defined as a type.
> freetest.cc: In function `void test_list()':
> freetest.cc:78: `list' undeclared (first use this function)
> freetest.cc:78: (Each undeclared identifier is reported only once for each
> function it appears in.)
> freetest.cc:78: parse error before `*' token
> freetest.cc: In function `void test_list_p()':
> freetest.cc:83: parse error before `*' token
> freetest.cc:84: `pl' undeclared (first use this function)
> freetest.cc: In function `void test_map()':
> freetest.cc:89: `Map' undeclared (first use this function)
> freetest.cc:89: parse error before `;' token
> freetest.cc:90: `m' undeclared (first use this function)
> freetest.cc:90: `Pair' undeclared (first use this function)
> freetest.cc: In function `void test_map_p()':
> freetest.cc:95: `pm' undeclared (first use this function)
> freetest.cc:95: parse error before `;' token
>
> suggestion: compile with -Wall. This will catch errors like:
>
> freetest.cc: In function `void * _malloc(unsigned int)':
> freetest.cc:41: warning: unsigned int format, pointer arg (arg 3)
> freetest.cc: In function `void _free(void *)':
> freetest.cc:47: warning: unsigned int format, pointer arg (arg 2)
>
> (sorry about messing up the formatting...)
>
> elf> void* _malloc (size_t cb) { void* pv = malloc (cb); printf
> elf> ("malloc %d -> 0x%x\n", cb, pv); return pv; }
>
> elf> void _free (void* pv) { printf ("free 0x%x\n", pv); free
> elf> (pv); }
>
> pointers should be %p, not %x. This will avoid the warning. When you
> use %p, you don't need to append the 0x at the front, it will happen
> automatically.
...must...break...free...old...habit...
> --
> Brian May <bam@debian.org>
>
>
> --
> To UNSUBSCRIBE, email to debian-devel-request@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Reply to: