Re: [Gc] Strange leak in simple code
Юрий Соколов <[email protected]> Wed, 15 Jul 2015 07:06:41 +0300
| Newsgroups | gmane.comp.programming.garbage-collection.boehmgc |
|---|---|
| Message-ID | <CAL-rCA1qLnsJFvTVhO6+V3vyzogxSZymfk8BMN=NXn64GS9Hvg@mail.gmail.com> |
Bruce, This code fails with libgc packaged with Debian and Ubuntu. It works with libgc compilled from source though. For "If *any* other value in memory looks like a pointer to one of your nodes" - i found that setting HEAP_START as high as 0x6000_00000000 and enabling unmap helps a lot on Linux x86_64. With regards, Yura 2015-07-15 7:00 GMT+03:00 Bruce Hoult <[email protected]>: > Ok, artificially tricky code, not what it first appears. > > However, it is still true that you are linking all the nodes together, > just that you are not *explicitly* retaining a pointer to the first node. > > All that is required for this to not be garbage collected is, for example: > > 1) the compiler to keep a copy of the pointer to the first node allocated > in a register or on the stack. Probably should not happen at -O0. > > 2) If *any* other value in memory looks like a pointer to one of your > nodes (not just the first one), then all nodes allocated after that one > will be retained. > > > On Wed, Jul 15, 2015 at 2:52 PM, Юрий Соколов <[email protected]> > wrote: > >> Read the code carefully. This code keeps pointer only to last node. So >> only two nodes are reachable at max. >> What do you mean "it leaks?" >> >> You're making a linked list, with every object pointed to either by >> 'last' or by the previous object. >> >> I would be very very unhappy if this was garbage collected!! >> >> >> On Mon, Jul 13, 2015 at 11:12 PM, Юрий Соколов <[email protected]> >> wrote: >> >>> Using libgc from Ubuntu 15.04 (7.2b-6.4) this simple code leaks: >>> >>> #include <gc.h> >>> struct list { >>> struct list* next; }; >>> int main() { >>> GC_INIT(); >>> struct list *last = NULL; >>> for (;;) { >>> struct list* nuo = GC_MALLOC(sizeof(struct list)); >>> nuo->next = NULL; >>> // if next line is commented, then no leakage >>> if (last) last->next = nuo; >>> last = nuo; >>> } } >>> >>> >>> >>> stackoverflow question >>> http://stackoverflow.com/questions/31380641/libgc-why-this-code-leaks >>> >>> -- >>> This message has been scanned for viruses and >>> dangerous content by *MailScanner* <http://www.mailscanner.info/>, and >>> is >>> believed to be clean. >>> _______________________________________________ >>> bdwgc mailing list >>> [email protected] >>> https://lists.opendylan.org/mailman/listinfo/bdwgc >>> >> >> >> -- >> This message has been scanned for viruses and >> dangerous content by *MailScanner* <http://www.mailscanner.info/>, and >> is >> believed to be clean. >> > > _______________________________________________ bdwgc mailing list [email protected] https://lists.opendylan.org/mailman/listinfo/bdwgc