Garbage collector collects live objects

ketmar via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Dec 9 08:17:41 PST 2014


On Tue, 09 Dec 2014 14:52:53 +0000
Ruslan Mullakhmetov via Digitalmars-d-learn
<digitalmars-d-learn at puremagic.com> wrote:

> On Tuesday, 9 December 2014 at 14:23:06 UTC, Steven Schveighoffer 
> wrote:
> > On 12/9/14 8:54 AM, Ruslan Mullakhmetov wrote:
> >>
> >> Hi,
> >>
> >> I experience very strange problem: GC somehow collects live 
> >> objects.
> >>
> >> I found it because i got segfaults. After debugging and 
> >> tracing i found
> >> this is because of accessing not allocated memory.
> >>
> >> I did the following checks:
> >>
> >> - added to some class invariant check for access to suspicious 
> >> members
> >> with assertion
> >>
> >> assert(GC.addrOf(cast(void*)x) !is null);
> >>
> >>
> >> where it fails DETERMINISTICALLY at some point
> >>
> >> - printing address of allocated classes where i observe the 
> >> following
> >> pattern
> >>
> >> -> ctor
> >>      check
> >>      check
> >>      check
> >> <- dtor
> >>      check (fails)
> >>
> >> could anybody advice me with something? I got really 
> >> frustrated by this
> >> strange behaviour which i can not fix right now.
> >>
> >> key observations:
> >> - it is deterministically behaviour (what gets me even more 
> >> confused
> >> cause GC collections as far as i know runs from time to time)
> >> - i do not play with pointers optimisation like hiding its in 
> >> ints or
> >> floats.
> >> - i operate with large uniformly distributed (video) data in 
> >> memory
> >> where pointer like patterns may occur. but this is not the 
> >> case cause
> >> (1) it brings at worst long living objects (2) input sequence 
> >> constant
> >> but allocated pointers each run different.
> >>
> >
> > A random guess, since you haven't posted any code, are you 
> > accessing GC resources inside a destructor? If so, that is not 
> > guaranteed to work. A class destructor, or a destructor of a 
> > struct that is contained inside a class, can only be used to 
> > destroy NON-GC resources.
> >
> > If you want more help, you need to post some code. Something 
> > that minimally causes the issue would be good.
> >
> > -Steve
> 
> No, there is no accessing GC resources in dtors.
> 
> the only usage of dtor in one class is
> 
> 	~this()
> 	{
> 		_file.close();
> 	}
> 
> where _file is of type std.file.File
> 
> i'll try to extract problem to any observable source code but all 
> my previous attempts lead to problem being diminish.

that file can be already finalized. please remember that `~this()` is
more a finalizer than destructor, and it's called on *dead* object.
here this means that any other object in your object (including
structs) can be already finalized at the time GC decides to call your
finalizer.

just avoid "destructors" unless you *really* need that. in your case
simply let GC finalize your File, don't try to help GC. this is not C++
(or any other language without GC) and "destructors" aren't destructing
anything at all. "destructors" must clean up the things that GC cannot
(malloc()'ed memory, for example), and nothing else.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://lists.puremagic.com/pipermail/digitalmars-d-learn/attachments/20141209/76994f1e/attachment.sig>


More information about the Digitalmars-d-learn mailing list