On Sunday, 28 April 2013 at 14:44:32 UTC, Steven Schveighoffer wrote:
On Sat, 27 Apr 2013 07:58:25 -0700, Vladimir Panteleev <vladi...@thecybershadow.net> wrote:

On Saturday, 27 April 2013 at 06:12:03 UTC, Steven Schveighoffer wrote:
On Thu, 25 Apr 2013 10:57:13 -0700, Vladimir Panteleev <vladi...@thecybershadow.net> wrote:

On Thursday, 25 April 2013 at 16:17:57 UTC, Jacob Carlborg wrote:
You cannot access GC controlled memory in class destructors.

Not true.

Can you be more specific? Maybe the wording was too strong. Should say "you shouldn't access GC controlled memory in class destructors."

Or are you thinking of some specific case? Because the opposite of the above is DEFINITELY not true. I just want to make that clear.

Last time I checked, destructors were called separately from deallocation. Thus, referencing memory will not result in undefined behavior. The order of destruction is non-deterministic, but otherwise, it's the same as accessing a clear()'d object, which is perfectly safe (from a memory safety perspective).

No, destructors are called along with deallocation. At the moment, the GC mutex is held while the collection is in progress, so it's not possible that a deallocated block could be reallocated before a dtor that references that block is called.

Right, so it makes no difference in practice.

What I meant was that IIRC early versions of the GC used to rebuild internal free lists, and clobber freed data, in-loop with calling destructors. Thus, when referencing something in a destructor, sometimes you'd get the same object (not yet finalized), and sometimes you'd get garbage. Now you get a finalized object instead of garbage.

But that is an implementation detail. There is no requirement for the GC to behave that way.

I don't disagree with you, but do we have a spec for GCs?

I'd think preserving memory safety, even in a destructor, would be pretty important for a GC design.

In addition, there is no requirement for the GC to run in a specific thread, so if a destroyed object references a non-destroyed object, it's possible some thread is using the non-destroyed object while the dtor is using it in another thread, even if the object was only ever accessed from one thread!

Sorry, not following. What's the problem? How is this related?

Reply via email to