[gclist] Boehm gc with STL from gcc 2.95.2?
Benjamin Geer
benjamin.geer@btinternet.com
Mon, 17 Apr 2000 22:52:47 +0100
Thanks, I understand now. Avoiding finalizers seems to be preferable
anyway, since if I understand correctly, not having to worry about
cyclic references is one of the main advantages of mark-sweep GC over
reference counting.
Ben
On Mon, Apr 17, 2000 at 02:17:38PM -0700, Boehm, Hans wrote:
> This is expected behavior. You are running into two issues:
>
> 1) A conservative collector usually can't tell precisely when something goes
> out of scope. The pointer value may still persist in a stack location
> that's not immediately overwritten, or in a register. This usually results
> in some unnecessary object retention, but this is rearely very significant
> in real programs. If you put your main program inside a loop, you should
> see things reclaimed over time.
>
> 2) The default finalization mechanism ensures that you don't accidentally
> see previously finalized objects from inside a finalizer. This means that
> immediately after your explicit garbage collection, only the first FooLink
> in the list can be safely finalized. If you finalized any other object, a
> subsequent finalizer could see a previously finalized FooLink. The net
> effect is that only one FooLink is finalized per GC cycle. (This implies
> that if the FooLink doesn't really need to access the next field, you should
> probably let the garbage collector know this, e.g. by instead finalizing an
> object referenced from FooLink instead of FooLink itself. Alternatively,
> you can get the collector to use Java-like finalization semantics, but then
> you need to be more careful about accessing previously finalized objects,
> particularly if they are wrappers for explicitly deallocated objects.)
>
> There are more details at
>
> http://www.hpl.hp.com/personal/Hans_Boehm/gc/finalization.html
>
> Hans
>
> -----Original Message-----
> From: Benjamin Geer [mailto:benjamin.geer@btinternet.com]
> Sent: Monday, April 17, 2000 12:26 PM
> To: gclist@iecc.com
> Cc: Boehm, Hans
> Subject: Re: [gclist] Boehm gc with STL from gcc 2.95.2?
>
>
> I think there might be a problem with gc_cpp. The following test
> program makes a singly-linked list, in which the links are derived
> from gc_cleanup, as is the data in each link. The output shows that
> none of the data objects are reclaimed. When I change it so that
> FooLink is derived from gc instead of gc_cleanup, all of them are
> reclaimed. Perhaps I've misunderstood, but it seems to me that it
> should work either way, since there are no circular references
> involved.
>
> Ben
>
> #include <gc_cpp.h>
> #include <iostream>
>
> using namespace std;
>
> int numCreated = 0;
> int numDeleted = 0;
>
> // Each link will contain one of these.
> class Foo : public gc_cleanup {
> public:
> Foo() {
> ++numCreated;
> }
>
> ~Foo() {
> ++numDeleted;
> }
> };
>
> // Links in a linked list.
> struct FooLink : public gc_cleanup {
> Foo* foo;
> FooLink* next;
>
> FooLink(Foo* arg_foo) : foo(arg_foo), next(0) { }
> };
>
> // Makes a linked list with 10000 links, then lets it go out of scope.
> void makeFoos() {
> Foo* first = new Foo();
> FooLink* head = new FooLink(first);
> FooLink* tail = head;
>
> for (int i = 0; i < 9999; ++i) {
> Foo* foo = new Foo;
> FooLink* next = new FooLink(foo);
> tail->next = next;
> tail = next;
> }
> }
>
> int main(int argc, char* argv[]) {
> makeFoos();
>
> GC_gcollect();
>
> cout << numCreated << " created, " << numDeleted << " deleted" << endl;
>
> return 0;
> }