On Tue, 10 Aug 2010 13:16:31 -0400, Jonathan M Davis <[email protected]> wrote:

On Tuesday, August 10, 2010 08:09:13 Steven Schveighoffer wrote:
But we should clarify a couple things.  First, destructors are *only*
valid for releasing resources not allocated by the GC.  For example, in
your Connection object, if you used a phobos object to make the
connection, and allocated that connection via new, then you are *not*
guaranteed that the GC hasn't collected that object already. So it is not
valid in the destructor.

Hmm. I don't recall ever reading that anywhere. I would not have expected
anything that was referenced by an object to be garbage collected until the destructor had been called on that object. Granted, the need for destructors on classes is minimal, but that seems like the kind of thing that should be in big red lettering somewhere. You just know that there are going to be plenty of programmers out there who are going to referencing newed data in the destructor. It's a very natural thing to do for cleanup if you have object references as
member data.

Yes, it is a common source of confusion to new programmers.

From this page: http://digitalmars.com/d/2.0/class.html#destructors

"The garbage collector is not guaranteed to run the destructor for all unreferenced objects. Furthermore, the order in which the garbage collector calls destructors for unreference objects is not specified. This means that when the garbage collector calls a destructor for an object of a class that has members that are references to garbage collected objects, those references may no longer be valid. This means that destructors cannot reference sub objects. This rule does not apply to auto objects or objects deleted with the DeleteExpression, as the destructor is not being run by the garbage collector, meaning all references are valid."

The second part that says when you delete it manually, the references are still valid is meaningless. You only get one destructor, and it's not notified whether its the GC calling it or delete/clear calling it. So if you write your destructor to cater to manual deletion, the program may crash if the GC destroys it.

Rule #1, destructors are only for non-GC allocated resources. With GC allocated resources, you have to assume they are invalid in the destructor. Always.

-Steve

Reply via email to